处理Spark 2.11中损坏的JSON行 - 与1.6不同的行为

时间:2018-03-31 00:55:09

标签: apache-spark

我们使用sql context读取了snappy文件。 e.g。

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df = sqlContext.read.json("s3://bucket/problemfile.snappy")

在spark 1.6中,我们会通过以下内容处理损坏的记录:

invalidJSON = rawEvents.select("*").where("_corrupt_record is not null");
validJSON = rawEvents.select("*").where("_corrupt_record is null");

在Spark 2.11中,我们甚至无法读取损坏的记录,例如

scala> df.select("*").where("_corrupt_record is null").count()

18/03/31 00:45:06 ERROR TaskSetManager: Task 0 in stage 1.0 failed 4 times; aborting job 
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 1.0 failed 4 times, most recent failure: Lost task 0.3 in stage 1.0 (TID 4, ip-172-31-48-73.ec2.internal, executor 2): 
java.io.CharConversionException: Unsupported UCS-4 endianness (3412) detected
at com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.reportWeirdUCS4(ByteSourceJsonBootstrapper.java:469)
at com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.checkUTF32(ByteSourceJsonBootstrapper.java:434)
at com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.detectEncoding(ByteSourceJsonBootstrapper.java:141)
at com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.constructParser(ByteSourceJsonBootstrapper.java:215)
at com.fasterxml.jackson.core.JsonFactory._createParser(JsonFactory.java:1287)

我知道我们可以在2.X中设置spark.sql.files.ignoreCorruptFiles = true但是我们可能会丢失记录,具体取决于损坏的记录的位置。

还有其他方法可以跳过损坏的记录吗?

由于

1 个答案:

答案 0 :(得分:0)

你可以这样做:

val spark = SparkSession.builder().getOrCreate()
val df = spark.read
  .option("mode", "DROPMALFORMED")
  .json("s3://bucket/problemfile.snappy")

这样Spark会为你丢弃无效的JSON,但你不会看到任何损坏的记录。