Прочитать с помощью ORC-файла spark с поврежденными картами - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть файлы orc в моих hdfs.Одним из полей является Карта (Строка, Строка).Каким-то образом в этом поле есть несколько строк со значением Map (null, null).null в ключах карты является критической ошибкой для Java.Итак, когда я пытаюсь получить доступ к этому полю, я получил исключение NullPointer.

Я хочу прочитать эти файлы и изменить эти поля на пустую карту.

Я попытался сделать это следующим образом:

val df = spark.read.format("orc").load("/tmp/bad_orc")

def func(s: org.apache.spark.sql.Row): String = { 
    try
    {
        if ( s(14) == null ) // the 14'th column is the column with Map(String,String) type
        {
            return "Ok"
        }
        else
        {
            return "Zero"
        }
    }
    catch
    {
        case x: Exception => return "Erro"
    }
}
df.rdd.map(func).take(20)

Я получил это исключение, когда язапустите этот скрипт.

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 417.0 failed 4 times, most recent failure: Lost task 0.3 in stage 417.0 (TID 97094, srvg1076.local.odkl.ru, executor 86): java.lang.NullPointerException
    at java.util.TreeMap.compare(TreeMap.java:1294)
    at java.util.TreeMap.put(TreeMap.java:538)
    at org.apache.orc.mapred.OrcMapredRecordReader.nextMap(OrcMapredRecordReader.java:507)
    at org.apache.orc.mapred.OrcMapredRecordReader.nextValue(OrcMapredRecordReader.java:554)
    at org.apache.orc.mapreduce.OrcMapreduceRecordReader.nextKeyValue(OrcMapreduceRecordReader.java:104)
    at org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39)
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
    at org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:101)
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source)
    at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
    at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$11$$anon$1.hasNext(WholeStageCodegenExec.scala:619)
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)

И когда я пытаюсь получить доступ к любому другому столбцу в этом орке - все в порядке.

Как отловить это исключение и как исправить эти файлы?Помогите мне, пожалуйста

...