如何只将一个DataFrame的`row`值写入spark中的文件?

时间:2017-07-16 04:19:11

标签: apache-spark apache-spark-sql spark-dataframe

我有一个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\"...}"}

我错过了什么?

1 个答案:

答案 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。