首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用pyspark从平面记录创建段数组

使用pyspark从平面记录创建段数组
EN

Stack Overflow用户
提问于 2020-09-02 17:01:11
回答 2查看 62关注 0票数 1

我有一个稀疏填充的表,其中包含唯一用户ids的各个段的值。我只需要创建一个包含unique_id和相关段标头的数组

请注意,这只是一个指示性的数据集。我有几百个这样的片段。

代码语言:javascript
运行
复制
------------------------------------------------
| user_id   | seg1 | seg2 | seg3 | seg4 | seg5 |
------------------------------------------------
| 100       |   M  |  null|   25 |  null|  30  |
| 200       |  null|  null|   43 |  null|  250 |
| 300       |   F  |  3000|  null|  74  |  null|
------------------------------------------------

我希望输出结果是

代码语言:javascript
运行
复制
-------------------------------
| user_id| segment_array      |
-------------------------------
| 100    | [seg1, seg3, seg5] |
| 200    | [seg3, seg5]       |
| 300    | [seg1, seg2, seg4] |
-------------------------------

在pyspark-sql的pyspark中有什么函数可以实现这一点吗?

谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-02 19:11:13

我找不到直接的方法,但你可以这样做。

代码语言:javascript
运行
复制
cols= df.columns[1:]

r = df.withColumn('array', array(*[when(col(c).isNotNull(), lit(c)).otherwise('notmatch') for c in cols])) \
  .withColumn('array', array_remove('array', 'notmatch'))
r.show()
+-------+----+----+----+----+----+------------------+
|user_id|seg1|seg2|seg3|seg4|seg5|             array|
+-------+----+----+----+----+----+------------------+
|    100|   M|null|  25|null|  30|[seg1, seg3, seg5]|
|    200|null|null|  43|null| 250|      [seg3, seg5]|
|    300|   F|3000|null|  74|null|[seg1, seg2, seg4]|
+-------+----+----+----+----+----+------------------+
票数 1
EN

Stack Overflow用户

发布于 2020-09-02 17:18:40

我不确定这是不是最好的方法,但我会这样攻击它:

有一个collect_set函数,它将在您聚合的一系列值中始终为您提供唯一的值。

对以下各项上的每个线段进行并集:

代码语言:javascript
运行
复制
df_seg_1 = df.select(
  'user_id', 
  fn.when(
    col('seg1').isNotNull(), 
    lit('seg1)
  ).alias('segment')
)
# repeat for all segments

df = df_seg_1.union(df_seg_2).union(...)

df.groupBy('user_id').agg(collect_list('segment'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63702173

复制
相关文章

相似问题

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