在 hive 或 pyspark 中将双数组字段更改为单个数组

Posted

技术标签:

【中文标题】在 hive 或 pyspark 中将双数组字段更改为单个数组【英文标题】:changing an double array field to a single array in hive or pyspark 【发布时间】:2021-12-27 18:32:53 【问题描述】:

我有一个字段 interest_product_id,如下所示 -

a.select('cust_id', 'interest_product_id').show(1,False)
+---------------+----------------------------------------------+
|cust_id        |interest_product_id                           |
+---------------+----------------------------------------------+
|4308c3w994     |[[73ndy0-885bns-ysrd, isgbf-6322-734f4-92j72]]|
+---------------+----------------------------------------------+

架构如下 -

root
 |-- cust_id: string (nullable = true)
 |-- interest_product_id: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: string (containsNull = true)

由于字段interest_product_id 是数组类型,并且元素是数组(字符串),因此字段显示[[**]]。如何将其转换为数组(字符串)??

预期结果 -

+---------------+----------------------------------------------+
|cust_id        |interest_product_id                           |
+---------------+----------------------------------------------+
|4308c3w994     |[73ndy0-885bns-ysrd, isgbf-6322-734f4-92j72]  |
+---------------+----------------------------------------------+

请建议最好的方法。谢谢!!

【问题讨论】:

【参考方案1】:

flatten,从嵌套数组创建一个平面数组。

from pyspark.sql import functions as F

df = spark.createDataFrame([("4308c3w994", [["73ndy0-885bns-ysrd", "isgbf-6322-734f4-92j72"]], )], ("cust_id", "interest_product_id", ))

df.withColumn("interest_product_id", F.flatten(F.col("interest_product_id"))).show(truncate=False)

输出

+----------+--------------------------------------------+
|cust_id   |interest_product_id                         |
+----------+--------------------------------------------+
|4308c3w994|[73ndy0-885bns-ysrd, isgbf-6322-734f4-92j72]|
+----------+--------------------------------------------+

【讨论】:

以上是关于在 hive 或 pyspark 中将双数组字段更改为单个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyspark 中将字符串更改为时间戳?

在pyspark中将值随机更改为空值的最有效方法是啥?

Hive 解析和编辑数组到结构字段

在 Pyspark 中将列类型从字符串更改为日期

在 Pyspark 中将字符串更改为时间戳

pyspark 在循环中将数组转换为字符串