我有一个MATCH (n) WHERE NOT EXISTS(n.foo) RETURN n
只有一列,其值为JSON字符串。我正在尝试将值只写入一个文件,每行一个记录。
dataframe
数据如下所示:
scala> selddf.printSchema
root
|-- raw_event: string (nullable = true)
我正在运行以下命令将其保存到文件:
scala> selddf.show(1)
+--------------------+
| raw_event|
+--------------------+
|{"event_header":{...|
+--------------------+
only showing top 1 row
输出如下:
selddf.select("raw_event").write.json("/data/test")
我希望输出只是说:
{"raw_event":"{\"event_header\":{\"version\":\"1.0\"...}"}
我错过了什么?
答案 0 :(得分:1)
发生这种情况的原因是,当您编写json时,您正在编写其中列为raw_event的数据框。
您的第一个选择是简单地将其写为文本:
df.write.text(filename)
另一个选项(如果你的json模式对所有元素都是常量)是使用from_json函数将其转换为合法的数据帧。选择元素(包含json所有成员的列的内容),然后保存它:
val df = Seq("{\"a\": \"str\", \"b\": [1,2,3], \"c\": {\"d\": 1, \"e\": 2}}").toDF("raw_event")
import org.apache.spark.sql.types._
val schema = StructType(Seq(StructField("a", StringType), StructField("b", ArrayType(IntegerType)), StructField("c", StructType(Seq(StructField("d", IntegerType), StructField("e", IntegerType))))))
df.withColumn("jsonData", from_json($"raw_event", schema)).select("jsonData.*").write.json("bla.json")
第二个选项的优点是你可以测试maleformed行(这会导致null),因此你可以添加一个过滤器来删除它们。
请注意,在这两种情况下,您都没有转义为“。如果您需要,您需要使用第一个选项,并首先执行添加转义的UDF。