HiveQL到PySpark - SELECT语句中的聚合列问题

时间:2017-07-20 15:51:30

标签: apache-spark pyspark hiveql

我有以下HQL脚本,需要pyspark,spark 1.6

insert into table db.temp_avg
select
a,
avg(b) ,
c 
from db.temp WHERE flag is not null GROUP BY a, c;

我创建了几个版本的spark代码,但是我正在努力将这个平均列放到select中。

此外,我发现分组数据无法以这种方式写入:

df3 = df2.groupBy...
df3.write.mode('overwrite').saveAsTable('db.temp_avg')

pyspark代码的一部分:

temp_table = sqlContext.table("db.temp")

df = temp_table.select('a', 'avg(b)', 'c', 'flag').toDF('a', 'avg(b)', 'c', 'flag')
df = df.where(['flag'] != 'null'))
# this ofc does not work along with the avg(b)
df2 = df.groupBy('a', 'c')
df3.write.mode('overwrite').saveAsTable('db.temp_avg')

感谢您的帮助。

正确的解决方案:

import pyspark.sql.functions as F
df = sqlContext.sql("SELECT * FROM db.temp_avg").alias("temp")
df = df.select('a', 'b', 'c')\
    .filter(F.col("temp.flag").isNotNULL())\
    .groupby('a', 'c')\
    .agg(F.avg('b').alias("avg_b"))

1 个答案:

答案 0 :(得分:1)

import pyspark.sql.functions as F
df = sqlContext.sql("select * from db.temp_avg")

df = df.select('a', b, 'c')\ .filter(F.col("flag").isNotNULL())\ .groupby('a', 'c')\ .agg(F.avg('b').alias("avg_b"))

然后你可以保存表格 df.saveAsTable("tabe_name")