首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据值动态创建列

根据值动态创建列
EN

Stack Overflow用户
提问于 2020-01-15 19:27:59
回答 1查看 31关注 0票数 0

在我们的项目中,我们使用一个ETL框架(内置在PySpark中),它接受Spark-sql语句来转换来自源的数据并加载Hive外部表。

现在,我需要读取一个表,然后选择一列的唯一值,然后动态创建一个包含这么多列的Hive表。

例如,请考虑下表。

第一天:

qstn_mstr:

代码语言:javascript
复制
prsnid | qstn 
1 | satisfactory
2 | survey 
3 | review

目标表结构:

代码语言:javascript
复制
prsnid | satisfactory | survey | review

在第1天:在上面的示例中,qstns列中有3唯一值,因此将使用这些3值作为列创建输出表。

第二天:说不。Qstn_mster表的qstn列中的唯一值的值更改为5(可以增加或减少),这反过来会影响no。目标表中的列的数量,现在需要保存5列。

第2天:

qstn_mstr:

代码语言:javascript
复制
prsnid | qstn 
1 | satisfactory
2 | survey 
3 | review 
4 | validity
5 | vote

目标表结构:

代码语言:javascript
复制
prsnid | satisfactory | survey | review | validity | vote

因此,在每一天,目标表结构都会动态变化。

使用带有配置单元表的PySpark环境设计/建模此类需求的最佳方式是什么?

请分享你的想法。

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 21:29:23

如果意图是对每一列应用一些计算,比如计数或distinct等,那么可以使用pivot

示例:

代码语言:javascript
复制
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())

输出:

代码语言:javascript
复制
+-------+------+------------+------+--------+----+
|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:

代码语言:javascript
复制
column_list = [psf.lit(0).alias(col[0]) 
               for col in 
               df.select("qstn")
               .distinct().collect()]


df.select(["prsn_id"] + column_list).show()

输出:

代码语言:javascript
复制
+-------+----+--------+------+------+------------+
|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|
+-------+----+--------+------+------+------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59750477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档