加载拼花

时间:2016-10-28 12:50:58

标签: apache-spark spark-dataframe parquet

我正在尝试在Spark中加载Parquet文件作为数据帧 -

val df= spark.read.parquet(path)

我正在 -

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 5.0 failed 4 times, most recent failure: Lost task 0.3 in stage 5.0 (TID 12, 10.250.2.32): java.lang.UnsupportedOperationException: Complex types not supported.

在浏览代码的过程中,我意识到有一个检查火花VectorizedParquetRecordReader.java(initializeInternal) -

Type t = requestedSchema.getFields().get(i);
  if (!t.isPrimitive() || t.isRepetition(Type.Repetition.REPEATED)) {
throw new UnsupportedOperationException("Complex types not supported.");
}

所以我认为它的失败是isRepetition方法。 任何人都可以建议我解决问题的方法吗?

我的实木复合地数据就像 -

Key1 = value1
Key2 = value1
Key3 = value1
Key4:
.list:
..element:
...key5:
....list:
.....element:
......certificateSerialNumber = dfsdfdsf45345
......issuerName = CN=Microsoft Windows Verification PCA, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
......subjectName = CN=Microsoft Windows, OU=MOPR, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
......thumbprintAlgorithm = Sha1
......thumbprintContent = sfdasf42dsfsdfsdfsd
......validFrom = 2009-12-07 21:57:44.000000
......validTo = 2011-03-07 21:57:44.000000
....list:
.....element:
......certificateSerialNumber = dsafdsafsdf435345
......issuerName = CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
......subjectName = CN=Microsoft Windows Verification PCA, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
......thumbprintAlgorithm = Sha1
......thumbprintContent = sdfsdfdsf43543
......validFrom = 2005-09-15 21:55:41.000000
......validTo = 2016-03-15 22:05:41.000000
  

我怀疑key4可能会因为嵌套而引发问题   树。输入数据是Json类型的,因此可能是镶木地板没有   理解复杂的水平如Json

我在Spark中发现了一个错误 https://issues.apache.org/jira/browse/HIVE-13744

但它说明了Hive复杂类型问题。不确定,这样可以解决镶木地板的问题吗?

更新1 进一步探索实木复合地板,我总结了以下 -

我在spark.write创建了5个镶木地板文件 其中2个镶木地板文件是空的,因此应该是ArrayType的列的模式将作为String类型出现,当我尝试将其整体读取时,我看到了上面的异常

1 个答案:

答案 0 :(得分:1)

取1
SPARK-12854 Vectorize Parquet reader表示从Spark 2.0.0开始,“ColumnarBatch支持结构和数组”(参见GitHub pull request 10820

SPARK-13518 Enable vectorized parquet reader by default,也是从Spark 2.0.0开始,处理属性spark.sql.parquet.enableVectorizedReader(参见GitHub commit e809074

我的2美分:禁用“VectorizedReader”优化,看看会发生什么。

拿2
由于问题已缩小到一些不显示与“真实”文件相同的模式的空文件,我的3美分:试验spark.sql.parquet.mergeSchema以查看真实文件中的模式是否优先于{{3}之后}。

除此之外,您可能会尝试在写入时根除空文件,并进行某种重新分区,例如: coalesce(1) (好的,1有点讽刺,但你明白了这一点)