我想执行大量的配置单元查询并将结果存储在数据框中。
我有一个非常大的数据集,其结构如下:
+-------------------+-------------------+---------+--------+--------+
| visid_high| visid_low|visit_num|genderid|count(1)|
+-------------------+-------------------+---------+--------+--------+
|3666627339384069624| 693073552020244687| 24| 2| 14|
|1104606287317036885|3578924774645377283| 2| 2| 8|
|3102893676414472155|4502736478394082631| 1| 2| 11|
| 811298620687176957|4311066360872821354| 17| 2| 6|
|5221837665223655432| 474971729978862555| 38| 2| 4|
+-------------------+-------------------+---------+--------+--------+
我想创建一个派生的数据框,该数据框使用每一行作为辅助查询的输入:
result_set = []
for session in sessions.collect()[:100]:
query = "SELECT prop8,count(1) FROM hit_data WHERE dt = {0} AND visid_high = {1} AND visid_low = {2} AND visit_num = {3} group by prop8".format(date,session['visid_high'],session['visid_low'],session['visit_num'])
result = hc.sql(query).collect()
result_set.append(result)
这可以正常工作一百行,但是会导致livy在较高的负载下超时。
我尝试使用map或foreach:
def f(session):
query = "SELECT prop8,count(1) FROM hit_data WHERE dt = {0} AND visid_high = {1} AND visid_low = {2} AND visit_num = {3} group by prop8".format(date,session.visid_high,session.visid_low,session.visit_num)
return hc.sql(query)
test = sampleRdd.map(f)
导致PicklingError: Could not serialize object: TypeError: 'JavaPackage' object is not callable
。我了解from this answer和this answer,spark上下文对象不可序列化。
我没有尝试先生成所有查询,然后运行批处理,因为我不支持从this question批处理查询。
我该如何进行?
答案 0 :(得分:0)
我要找的是:
pyspark.sql.functions.when()
和df.withColumn()
,然后根据大数据框的值添加自定义列,然后df.groupBy()
和pyspark.sql.functions.sum()
修饰结果数据框我想我还没有完全意识到Spark会懒惰地处理数据帧。支持的工作方式是先定义大型数据帧,然后进行适当的转换。 Spark将尝试一次执行数据检索和转换,最后一次并分发。我试图限制作用域的范围,从而导致功能不受支持。