Apache spark 如何在spark中将数据帧的'row'值写入文件?

Apache spark 如何在spark中将数据帧的'row'值写入文件?,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我有一个只有一列的dataframe,它的值是一个JSON字符串。我试图只将值写入一个文件,每行一条记录 scala> selddf.printSchema root |-- raw_event: string (nullable = true) 数据如下所示: scala> selddf.show(1) +--------------------+ | raw_event| +--------------------+ |{"event_header":{.

我有一个只有一列的
dataframe
,它的值是一个JSON字符串。我试图只将值写入一个文件,每行一条记录

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\"...}"}
我想让输出只说:

{\"event_header\":{\"version\":\"1.0\"...}

我遗漏了什么?

发生这种情况的原因是,当您编写json时,您正在编写数据帧,其中列是原始事件

您的第一个选择是简单地将其写成文本:

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")
第二个选项的优点是,您可以测试错误格式的行(这将导致null),因此您可以添加一个过滤器来删除它们

请注意,在这两种情况下,都没有“.”的转义。如果需要,则需要使用第一个选项,并首先执行添加转义的UDF