根据Spark数据帧单元格值进行查询

时间:2019-08-30 22:54:14

标签: python dataframe apache-spark databricks

我想在表上运行许多查询,这些查询利用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

那么,如何并行运行这些查询?还是我有更好的方法来遍历大量查询?

1 个答案:

答案 0 :(得分:0)

类似的问题为:Trying to execute a spark sql query from a UDF

简而言之,不能在UDF中执行SQL查询。