从值动态创建列

20jt8wwn  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(434)

在我们的项目中,我们使用一个 ETL 框架(内置 PySpark )哪个接受 Spark-sql 语句从源代码转换数据并加载 Hive 外部表。
现在,我需要读取一个表,然后选择一列的唯一值,然后动态创建一个包含那么多列的配置单元表。
例如,考虑下表。
第1天:
质量标准:

prsnid | qstn 
1 | satisfactory
2 | survey 
3 | review

目标表结构:

prsnid | satisfactory | survey | review

第1天:在上面的例子中 3 中的唯一值 qstns 列,因此使用这些列创建输出表 3 值作为列。
在第二天:说出在 qstn 中的列 Qstn_mster 表更改为5(可以增加或减少),这反过来会影响目标表中的列数,现在需要保留这些列 5 柱。
第2天:
质量标准:

prsnid | qstn 
1 | satisfactory
2 | survey 
3 | review 
4 | validity
5 | vote

目标表结构:

prsnid | satisfactory | survey | review | validity | vote

因此,每一天,目标表结构都会动态变化。
使用带有配置单元表的pyspark环境设计/建模此类需求的最佳方法是什么?
请分享你的想法。

dluptydi

dluptydi1#

如果目的是对每一列应用一些计算,如计数或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|
+-------+----+--------+------+------+------------+

相关问题