python dataframe collect()函数

python dataframe collect()函数,python,json,apache-spark,pyspark,apache-spark-sql,Python,Json,Apache Spark,Pyspark,Apache Spark Sql,我在使用collect()函数时遇到了一个非常奇怪的问题 JsonObj看起来像这样: [ { "id" : 1, "name" : "hello" }, { "id" : 2, "name" : "world" } ] 现在,当我遍历collect函数生成的列表并打印行[“jsonObj”]时,我将JSON对象作为字符串的一部分,而不仅仅是J

我在使用collect()函数时遇到了一个非常奇怪的问题

JsonObj看起来像这样:

[
 {
   "id" : 1,
   "name" : "hello"
 },
 {
   "id" : 2,
   "name" : "world"
 }
]
现在,当我遍历collect函数生成的列表并打印行[“jsonObj”]时,我将JSON对象作为字符串的一部分,而不仅仅是JSON对象。像现在一样,我将向数组中的每个对象添加“。问题是,当我试图将其写入文件时,它会变成字符串数组,而不是json对象数组

['{
   "id" : 1,
   "name" : "hello"
 }',
 '{
   "id" : 2,
   "name" : "world"
 }'
]
还有其他人面临同样的问题吗?我只想将JsonObj按原样存储到文件中,而不是作为字符串

节点id 箱子 类型 杰索诺布 1. A. 类型1 [{“id”:11,“name”:“hello”},{“id”:12,“name”:“world”}]
您可以使用
from_JSON
将JSON字符串转换为结构:

import pyspark.sql.functions as F
from pyspark.sql.types import *

df2 = df.withColumn(
    "jsonObj",
    F.from_json(
        F.col('jsonObj').cast('string'), 
        ArrayType(StructType([StructField('id', IntegerType()), StructField('name', StringType())]))
    )
)

df2.show(truncate=False)
+-------+---+-----+--------------------------+
|node_id|bin|type |jsonObj                   |
+-------+---+-----+--------------------------+
|1      |a  |type1|[[11, hello], [12, world]]|
+-------+---+-----+--------------------------+

df2.write.json('filepath')
它应该将输出作为

{"node_id":"1","bin":"a","type":"type1","jsonObj":[{"id":11,"name":"hello"},{"id":12,"name":"world"}]}

dataframe可能将jsonobj列作为字符串类型的数组。如果您想要JSON对象,您需要使用_JSON中的
将其强制转换为结构数组。您能给我一个如何执行此操作的示例吗?我在上面的问题中添加了示例响应,以及您如何将其写入文件。您是否将其作为csv文件编写?还是json文件?我正在将其写入json文件谢谢您发布解决方案。但是我得到了:org.apache.spark.sql.catalyst.parser.ParseException:在输入'>'(第1行,位置28)@A007处没有可行的替代方案。。。火花版本问题。需要spark>=2.4才能使用transform。明白了,spark版本<2.4是否还有其他替代方案?我们是否也需要导入array和struct?因为现在我在输入端找不到可行的替代方案,“spark版本是2.2.0”
{"node_id":"1","bin":"a","type":"type1","jsonObj":[{"id":11,"name":"hello"},{"id":12,"name":"world"}]}