在我们的项目中,我们使用一个ETL框架(内置在PySpark中),它接受Spark-sql语句来转换来自源的数据并加载Hive外部表。
现在,我需要读取一个表,然后选择一列的唯一值,然后动态创建一个包含这么多列的Hive表。
例如,请考虑下表。
第一天:
qstn_mstr:
prsnid | qstn
1 | satisfactory
2 | survey
3 | review目标表结构:
prsnid | satisfactory | survey | review在第1天:在上面的示例中,qstns列中有3唯一值,因此将使用这些3值作为列创建输出表。
第二天:说不。Qstn_mster表的qstn列中的唯一值的值更改为5(可以增加或减少),这反过来会影响no。目标表中的列的数量,现在需要保存5列。
第2天:
qstn_mstr:
prsnid | qstn
1 | satisfactory
2 | survey
3 | review
4 | validity
5 | vote目标表结构:
prsnid | satisfactory | survey | review | validity | vote因此,在每一天,目标表结构都会动态变化。
使用带有配置单元表的PySpark环境设计/建模此类需求的最佳方式是什么?
请分享你的想法。
发布于 2020-01-30 21:29:23
如果意图是对每一列应用一些计算,比如计数或distinct等,那么可以使用pivot
示例:
df = sqlContext.createDataFrame(
[[1, "satisfactory"],
[2, "survey"],
[3, "review"],
[4, "validity"],
[5, "vote"],],
["prsn_id", "qstn"])
(df
.groupBy(["prsn_id"])
.pivot("qstn")
.agg({"prsn_id": "count"})
.fillna(0)
.orderBy(["prsn_id"])
.show())输出:
+-------+------+------------+------+--------+----+
|prsn_id|review|satisfactory|survey|validity|vote|
+-------+------+------------+------+--------+----+
| 1| 0| 1| 0| 0| 0|
| 2| 0| 0| 1| 0| 0|
| 3| 1| 0| 0| 0| 0|
| 4| 0| 0| 0| 1| 0|
| 5| 0| 0| 0| 0| 1|
+-------+------+------------+------+--------+----+但是,如果其目的只是创建这些列,那么现在将它们设置为0:
column_list = [psf.lit(0).alias(col[0])
for col in
df.select("qstn")
.distinct().collect()]
df.select(["prsn_id"] + column_list).show()输出:
+-------+----+--------+------+------+------------+
|prsn_id|vote|validity|survey|review|satisfactory|
+-------+----+--------+------+------+------------+
| 1| 0| 0| 0| 0| 0|
| 2| 0| 0| 0| 0| 0|
| 3| 0| 0| 0| 0| 0|
| 4| 0| 0| 0| 0| 0|
| 5| 0| 0| 0| 0| 0|
+-------+----+--------+------+------+------------+https://stackoverflow.com/questions/59750477
复制相似问题