_json的火花也不例外

_json的火花也不例外,json,scala,apache-spark,Json,Scala,Apache Spark,我正在使用Spark 2.1(scala 2.11) 我想将定义了模式的json格式字符串从一个数据帧加载到另一个数据帧中。 我尝试过一些解决方案,但最便宜的是来自_json的标准列函数。 我用这个函数尝试了一个示例(),结果出乎意料 val df = spark.read.text("testFile.txt") df.show(false) +----------------+ |value | +----------------+ |{"a": 1, "b": 2}

我正在使用Spark 2.1(scala 2.11)

我想将定义了模式的json格式字符串从一个数据帧加载到另一个数据帧中。 我尝试过一些解决方案,但最便宜的是来自_json的标准列函数。 我用这个函数尝试了一个示例(),结果出乎意料

val df = spark.read.text("testFile.txt")

df.show(false)

+----------------+
|value           |
+----------------+
|{"a": 1, "b": 2}|
|{bad-record     |
+----------------+


df.select(from_json(col("value"),
      StructType(List(
                  StructField("a",IntegerType),
                  StructField("b",IntegerType)
                ))
    )).show(false)


+-------------------+
|jsontostruct(value)|
+-------------------+
|[1,2]              |
|null               |
+-------------------+
此行为类似于模式:PERMISSIVE,它不是默认值。 默认情况下,它被设置为FAILFAST模式,这意味着只要输入数据和强制模式不匹配,它就会抛出异常

我尝试使用DataFrameReader(JSON数据源和FAILFAST模式)加载testFile.txt,并成功捕获了一个异常

spark.read.option("mode","FAILFAST").json("test.txt").show(false)

---
Caused by: org.apache.spark.sql.catalyst.json.SparkSQLJsonProcessingException: Malformed line in FAILFAST mode: {bad-record
---

虽然两种情况下的解析模式相同,但为什么各自的输出如此不同?

这是一种预期行为<代码>from_json是一个SQL函数,在这个级别上没有异常(故意异常)的概念。如果操作失败,则结果未定义
NULL

虽然
from_json
提供了
options
参数,允许您设置json读取器选项,但由于上述原因,无法覆盖此行为


另请注意,
DataFrameReader的默认模式是允许的。

请注意,您正在将文件作为文本文件读取并将其转换为json。默认情况下,换行符将是文本文件的分隔符,如果您有一个有效的JSON字符串,那么它将在一行中正确转换为您在from_JSON()方法中定义的模式

如果有空行或无效的JSON文本,则会得到NULL

看看这个:

val df = spark.read.text("in/testFile.txt")
println("Default show()")
df.show(false)

println("Using the from_json method ")
df.select(from_json(col("value"),
  StructType(List(
    StructField("a",IntegerType),
    StructField("b",IntegerType)
  ))
)).show(false)
当in/testFile.txt中包含以下内容时

{"a": 1, "b": 2 }
它打印

Default show()
+-----------------+
|value            |
+-----------------+
|{"a": 1, "b": 2 }|
+-----------------+

Using the from_json method 
+--------------------+
|jsontostructs(value)|
+--------------------+
|[1,2]               |
+--------------------+
当您的输入带有空行时

{"a": 1, "b": 2 }
// Blank line
结果是

Default show()
+-----------------+
|value            |
+-----------------+
|{"a": 1, "b": 2 }|
|                 |
+-----------------+

Using the from_json method 
+--------------------+
|jsontostructs(value)|
+--------------------+
|[1,2]               |
|null                |
+--------------------+

那么,有没有其他方法可以让我创建自己的例外?我理解并同意你的观点。我已经确保输入的测试数据是正确的文本格式。我希望使用from_json创建的投影抛出错误/异常,而不是null。根据@user11022201,因为from_json是一个SQL函数,所以它不会显示我所期望的任何此类行为。