Pyspark:将嵌套结构转换为字符串的数组

2024-06-16 10:59:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为Filters的列的pyspark dataframe: “阵列>;”

我想将我的数据帧保存在csv文件中,为此我需要将数组转换为字符串类型。

我试图转换它:DF.Filters.tostring()DF.Filters.cast(StringType()),但这两个解决方案都为列过滤器中的每一行生成错误消息:

org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@56234c19

代码如下

from pyspark.sql.types import StringType

DF.printSchema()

|-- ClientNum: string (nullable = true)
|-- Filters: array (nullable = true)
    |-- element: struct (containsNull = true)
          |-- Op: string (nullable = true)
          |-- Type: string (nullable = true)
          |-- Val: string (nullable = true)

DF_cast = DF.select ('ClientNum',DF.Filters.cast(StringType())) 

DF_cast.printSchema()

|-- ClientNum: string (nullable = true)
|-- Filters: string (nullable = true)

DF_cast.show()

| ClientNum | Filters 
|  32103    | org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@d9e517ce
|  218056   | org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@3c744494

JSON数据示例:

{"ClientNum":"abc123","Filters":[{"Op":"foo","Type":"bar","Val":"baz"}]}

谢谢!!


Tags: orgtruedfsqlstringapachefiltersexpressions
3条回答

你可以试试这个:

DF = DF.withColumn('Filters', DF.Filters.cast("string"))

在Pyspark中,函数to_json()完成了任务。

与简单的字符串转换相比,它还保留了“struct键”(而不仅仅是“struct值”)。因此,对于所报告的示例,我将得到如下内容:

[{"Op":"foo","Type":"bar","Val":"baz"}]

这对我更有用,因为我必须将结果写入Postgres表。在这种格式下,我可以很容易地在Postgres中使用受支持的JSON函数

我创建了一个示例JSON数据集来匹配该模式:

{"ClientNum":"abc123","Filters":[{"Op":"foo","Type":"bar","Val":"baz"}]}

select(s.col("ClientNum"),s.col("Filters").cast(StringType)).show(false)

+---------+------------------------------------------------------------------+
|ClientNum|Filters                                                           |
+---------+------------------------------------------------------------------+
|abc123   |org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@60fca57e|
+---------+------------------------------------------------------------------+

最好使用explode()函数来解决您的问题,该函数先展平一个数组,然后使用star expand表示法:

s.selectExpr("explode(Filters) AS structCol").selectExpr("structCol.*").show()
+---+----+---+
| Op|Type|Val|
+---+----+---+
|foo| bar|baz|
+---+----+---+

要使其成为由逗号分隔的单列字符串,请执行以下操作:

s.selectExpr("explode(Filters) AS structCol").select(F.expr("concat_ws(',', structCol.*)").alias("single_col")).show()
+-----------+
| single_col|
+-----------+
|foo,bar,baz|
+-----------+

分解数组引用:Flattening Rows in Spark

“struct”类型的星扩展引用:How to flatten a struct in a spark dataframe?

相关问题 更多 >