为了处理我拥有的数据,我之前提取了模式,因此当我读取数据集时,我提供了模式,而不是通过推断模式的昂贵步骤。
为了构造模式,我需要将几个不同的模式合并到最终的模式中,所以我一直在使用union (++)
anddistinct
方法,但我一直收到org.apache.spark.sql.AnalysisException: Duplicate column(s)
异常。
例如,假设我们在以下结构中有两个模式:
val schema1 = StructType(StructField("A", StructType(
StructField("i", StringType, true) :: Nil
), true) :: Nil)
val schema2 = StructType(StructField("A", StructType(
StructField("i", StringType, true) :: Nil
), true) :: Nil)
val schema3 = StructType(StructField("A", StructType(
StructField("i", StringType, true) ::
StructField("ii", StringType, true) :: Nil
), true) :: Nil)
val final_schema = (schema1 ++ schema2 ++ schema3).distinct
println(final_schema)
输出:
StructType(
StructField(A,StructType(
StructField(i,StringType,true)),true),
StructField(A,StructType(
StructField(i,StringType,true),
StructField(ii,StringType,true)),true))
我知道只有与另一个模式完全匹配的模式结构才会被distinct
. 但是我希望结果看起来像这样:
StructType(
StructField(A,StructType(
StructField(i,StringType,true),
StructField(ii,StringType,true)),true))
其中所有的都被“组合”成一个模式。我已经筛选了scala 文档中的所有方法,但似乎找不到解决此问题的正确方法。有任何想法吗?
编辑:
最终目标是使用方法final_schema
输入sqlContext.read.schema
和读取 JSON 字符串的 RDD 。read