如果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映射到该列,用新转换的列替换旧列。问题是,与我在“频率”,“百分位数”,“均值”,“最小值”,“最大值”,“标准偏差”等列上运行的其他操作相比,似乎要花很长时间。
DataFrame的withColumn
函数似乎没有利用多个内核;如何获得相似的功能但具有并行化功能?
我正在具有12个内核和16 GB RAM的计算机上进行本地测试。
我知道我可以将DataFrame转换为RDD并进行并行化,但是如果有其他方法,我想避免这种情况。
我还知道使用Scala / Java UDF会更快,但是我认为仍然可以使用withColumn
在一个内核上执行该操作?