Spark与列功能并行化

时间:2018-09-19 15:03:29

标签: apache-spark pyspark apache-spark-sql

目标

如果withColumn尚未并行运行,则需要并行化withColumn功能,以便更快地转换(大)DataFrame列中的值。

背景

我正在使用PySpark。

我有一个format.json文件,其中包含某些正则表达式搜索和转换操作指令。

这里是一个示例:

{
  "currency": {
    "dtype": "float64",
    "searches": [
      {
        "regex_search": "^[\\s]*\\$[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\\.[0-9]{2})?[\\s]*$",
        "op": {
          "replace": {
            "regex": "[$,]",
            "sub": ""
          }
        }
      },
      {
        "regex_search": "^[\\s]*See Award Doc[\\s]*$",
        "op": {
          "replace": {
            "regex": "^.*$",
            "sub": ""
          }
        }
      }
    ]
  }
}

我有一个UDF,它本质上是通过一列查看并试图匹配和转换数据。

# transform data so that column can be cast properly
udf_match_and_transform = f.udf(lambda data: match_and_transform(data, format_dict), StringType())
df = df.withColumn(column_name, udf_match_and_transform(df[column_name]))

match_and_transform函数实际上是查看格式字典,并尝试将给定值与格式匹配,然后返回对该值的转换。

最后一行使用withColumn本质上将UDF映射到该列,用新转换的列替换旧列。问题是,与我在“频率”,“百分位数”,“均值”,“最小值”,“最大值”,“标准偏差”等列上运行的其他操作相比,似乎要花很长时间。

TLDR

DataFrame的withColumn函数似乎没有利用多个内核;如何获得相似的功能但具有并行化功能?

注释

我正在具有12个内核和16 GB RAM的计算机上进行本地测试。

我知道我可以将DataFrame转换为RDD并进行并行化,但是如果有其他方法,我想避免这种情况。

我还知道使用Scala / Java UDF会更快,但是我认为仍然可以使用withColumn在一个内核上执行该操作?

0 个答案:

没有答案