pyspark-sql - 每月频率的 Pyspark 性能低下
问题描述
Hive A Table 中有两个表 A , B 具有以下列,并且基于 Day 进行分区。我们需要提取从 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 代码,我考虑只是为了测试总时间。A 将 B 与 ID 和输出 ID 以及 A 的其他列一起连接。完成需要 1 小时。有没有更好的方法通过获取 1 个月或 1 年的数据来优化查询。并且输出表在插入数据的 2 列上进行分区,这就是使用配置单元上下文的原因。
解决方案
我已经建立了第三个表 C 与三列 - Start_Date End_Date Month_No 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 , 用过Range[1-12) & then "select * From A where day >=start_date & day<=End_Date & month_no='{0}'".format(i[0])。称为解决代码的循环。
推荐阅读
- javascript - 邀请创建的事件(discord.js v12)
- r - R GGplot geom_area 数据可能无意重叠
- android - 在 Unity 的 admob 中加载奖励广告时出现“无广告配置”消息
- c# - 有没有办法使用公式“LOOKUP()”从单元格中获取计算结果值
- php - 使用碳格式日期添加日期/增量
- xml - 使用python将多个xml文件保存为文本文件
- openshift - 关于 x509 的另一个错误:证书由未知机构签名
- c++ - GDB 无法进入某些功能
- python - 正则表达式 - 匹配最后出现的括号
- nginx - 发送到 uWsgi 时,Nginx 似乎将 URI(路径+查询)的大小加倍