首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将结构数组转换为字符串

将结构数组转换为字符串
EN

Stack Overflow用户
提问于 2019-08-06 17:52:25
回答 2查看 4.2K关注 0票数 3

我有下面的数据格式

代码语言:javascript
复制
+----+-------+-----+                                                            
|name|subject|score|
+----+-------+-----+
| Tom|   math|   90|
| Tom|physics|   70|
| Amy|   math|   95|
+----+-------+-----+

我使用了collect_listpyspark.sql.functions中的struct函数

代码语言:javascript
复制
df.groupBy('name').agg(collect_list(struct('subject', 'score')).alias('score_list'))

以获得以下数据

代码语言:javascript
复制
+----+--------------------+
|name|          score_list|
+----+--------------------+
| Tom|[[math, 90], [phy...|
| Amy|        [[math, 95]]|
+----+--------------------+

我的问题是如何将最后一列score_list转换为字符串并将其转储到csv文件中,如

代码语言:javascript
复制
Tom     (math, 90) | (physics, 70)
Amy     (math, 95)

非常感谢你的帮助,谢谢。

更新:Here是一个类似的问题,但并不完全相同,因为它直接从string传递到另一个string。在我的例子中,我想首先将collect_list<struct>转换为string,最后将这个collect_list<struct>.压缩

EN

Stack Overflow用户

发布于 2019-08-07 16:43:57

根据您的更新和注释,对于Spark 2.4.0+,有一种方法可以使用Spark内置函数来构造一个结构数组:transformarray

代码语言:javascript
复制
>>> df.printSchema()
root
 |-- name: string (nullable = true)
 |-- score_list: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- subject: string (nullable = true)
 |    |    |-- score: integer (nullable = true)

>>> df.show(2,0)
+----+---------------------------+
|name|score_list                 |
+----+---------------------------+
|Tom |[[math, 90], [physics, 70]]|
|Amy |[[math, 95]]               |
+----+---------------------------+

>>> df1.selectExpr(
        "name"
      , """
         array_join(
             transform(score_list, x -> concat('(', x.subject, ', ', x.score, ')'))
           , ' | '
         ) AS score_list
        """
).show(2,0)

+----+--------------------------+
|name|score_list                |
+----+--------------------------+
|Tom |(math, 90) | (physics, 70)|
|Amy |(math, 95)                |
+----+--------------------------+

其中:

  1. 使用transform()将结构数组转换为字符串数组。对于每个数组元素( struct x),我们使用concat('(', x.subject, ', ', x.score, ')')将其转换为字符串。
  2. 使用array_join()将所有数组元素(StringType)与|连接起来,这将返回最终的字符串
票数 7
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57381557

复制
相关文章

相似问题

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