我想在表上运行许多查询,这些查询利用python的Spark框架通过并行而不是顺序运行它们。
当我使用for循环运行查询时,它执行得非常慢,因为(我相信)它无法并行中断工作。例如:
for fieldName in fieldList:
result = spark.sql("select cast({0} as string) as value,
count({0}) as FREQ
from {1} group by {0} order by FREQ desc limit 5".format(fieldName, tableName))
我试图制作一个数据框,其中包含一个名为“ queryStr”的列来保存查询,然后使用“ RESULTS”列来保存以下命令:
inputDF = inputDF.withColumn('RESULTS', queryUDF(inputDF.queryStr))
UDF读取:
resultSchema = ArrayType(StructType([
StructField('VALUE', StringType(), True),
StructField('FREQ',IntegerType(), True)
]), True)
queryUDF = udf(lambda queryStr: spark.sql(queryStr).collect(), resultSchema
我正在使用Spark版本2.4.0。
我的错误是:
PicklingError: Could not serialize object: TypeError: 'JavaPackage' object is not callable
那么,如何并行运行这些查询?还是我有更好的方法来遍历大量查询?