我有一个名为过滤器的列的pyspark数据框: “阵列>” 中
我想在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"}]}
谢谢!
答案 0 :(得分:3)
我创建了一个示例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()函数来解决,这个函数会使数组变平,然后是星形扩展符号:
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?
答案 1 :(得分:0)
你可以试试这个:
DF = DF.withColumn('Filters', DF.Filters.cast("string"))
答案 2 :(得分:0)
对于我来说,在Pyspark中,功能to_json()完成了这项工作。
与简单地转换为String相比,它还保留了“结构键”(不仅是“结构值”)。因此,对于报告的示例,我将具有以下内容:
[{"Op":"foo","Type":"bar","Val":"baz"}]
这对我来说非常有用,因为我必须将结果写入Postgres表中。通过这种格式,我可以轻松地在Postgres中使用受支持的JSON函数