Hive中有两个表A,B。表具有以下列,并根据天进行了分区。我们需要提取2016年1月1日至2016年12月31日之间的数据。我刚刚提到了样本,但这些记录在1年中以百万计。表A如下
ID Day Name Description
1 2016-09-01 Sam Retail
2 2016-01-28 Chris Retail
3 2016-02-06 ChrisTY Retail
4 2016-02-26 Christa Retail
3 2016-12-06 ChrisTu Retail
4 2016-12-31 Christi Retail
Table B
ID SkEY
1 1.1
2 1.2
3 1.3
以下查询正在运行,但是花费很长时间,因为列数大约为60(仅用于示例3)。性能一点也不好,因为结果需要1个小时才能处理20天的分区,请您找出并优化查询。
from pyspark.sql import sparksession
from pyspark.sql import functions as F
from pyspark import HiveContext
hiveContext= HiveContext(sc)
def UDF_df(i):
print(i[0])
ABC2 = spark.sql(
"select * From A where day ='{0}'".format(i[0])
)
Join = ABC2.join(
Tab2,
(
ABC2.ID == Tab2.ID
)
).select(
Tab2.skey,
ABC2.Day,
ABC2.Name,
ABC2.Description
)
Join.select(
"Tab2.skey",
"ABC2.Day",
"ABC2.Name",
"ABC2.Description"
).write.mode("append").format("parquet").insertinto("Table")
ABC=spark.sql(
"select distinct day from A where day<= '2016-01-01' and day<='2016-12-31'"
)
Tab2=spark.sql("select * from B where day is not null")
for in in ABC.collect():
UDF_df(i)
上面是我一个月用来测试总时间的pyspark代码。具有ID和输出ID的Join B以及A的其他列。需要1个小时才能完成。是否有更好的方法通过获取1个月或1年的数据来优化查询。输出表也分为两列,其中插入了数据,这就是使用蜂巢上下文的原因。
答案 0 :(得分:0)
我用三个列构建了第三个表C- 起始日期结束日期月_否 2016-01-01 2016-01-31 1 2016-02-01 2016-02-28 2 2016-03-01 2016-03-31 3 2016-04-01 2016-04-30 4 2016-05-01 2016-05-31 5 2016-06-01 2016-06-30 6 2016-07-01 2016-07-31 7 2016-08-01 2016-08-31 8 2016-09-01 2016-09-30 9 2016-10-01 2016-10-30 10 2016-11-01 2016-11-31 11 2016-12-01 2016-12-31 12 , 使用范围[1-12],然后“选择* From A from day> = start_date&day <= End_Date&month_no ='{0}'”。format(i [0])。称为解决代码的循环。