从值动态创建列

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

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

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

目标表结构:

  1. prsnid | satisfactory | survey | review

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

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

目标表结构:

  1. prsnid | satisfactory | survey | review | validity | vote

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

dluptydi

dluptydi1#

如果目的是对每一列应用一些计算,如计数或distinct等,那么可以使用 pivot 例子:

  1. df = sqlContext.createDataFrame(
  2. [[1, "satisfactory"],
  3. [2, "survey"],
  4. [3, "review"],
  5. [4, "validity"],
  6. [5, "vote"],],
  7. ["prsn_id", "qstn"])
  8. (df
  9. .groupBy(["prsn_id"])
  10. .pivot("qstn")
  11. .agg({"prsn_id": "count"})
  12. .fillna(0)
  13. .orderBy(["prsn_id"])
  14. .show())

输出:

  1. +-------+------+------------+------+--------+----+
  2. |prsn_id|review|satisfactory|survey|validity|vote|
  3. +-------+------+------------+------+--------+----+
  4. | 1| 0| 1| 0| 0| 0|
  5. | 2| 0| 0| 1| 0| 0|
  6. | 3| 1| 0| 0| 0| 0|
  7. | 4| 0| 0| 0| 1| 0|
  8. | 5| 0| 0| 0| 0| 1|
  9. +-------+------+------------+------+--------+----+

但如果只是想创建这些列,比如说,现在将它们设置为0,那么:

  1. column_list = [psf.lit(0).alias(col[0])
  2. for col in
  3. df.select("qstn")
  4. .distinct().collect()]
  5. df.select(["prsn_id"] + column_list).show()

输出:

  1. +-------+----+--------+------+------+------------+
  2. |prsn_id|vote|validity|survey|review|satisfactory|
  3. +-------+----+--------+------+------+------------+
  4. | 1| 0| 0| 0| 0| 0|
  5. | 2| 0| 0| 0| 0| 0|
  6. | 3| 0| 0| 0| 0| 0|
  7. | 4| 0| 0| 0| 0| 0|
  8. | 5| 0| 0| 0| 0| 0|
  9. +-------+----+--------+------+------+------------+
展开查看全部

相关问题