基于spark数据帧单元值的查询

2024-09-28 22:27:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过并行而不是顺序地运行Spark框架和python,在一个表上运行许多查询

当我使用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))

自定义项如下:

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

那么,如何并行运行这些查询呢?或者,有没有更好的方法来迭代大量的查询


Tags: trueforsqlbyasnotresultsspark