spark数据集中的列名不正确

时间:2016-09-19 12:05:55

标签: scala apache-spark-sql kryo

我有下一个案例类:

case class Data[T](field1: String, field2: T)

我正在使用kryo序列化程序,其中包含下一个含义:

implicit def single[A](implicit c: ClassTag[A]): Encoder[A] = Encoders.kryo[A](c)

implicit def tuple2[A1, A2](implicit e1: Encoder[A1], e2: Encoder[A2]): Encoder[(A1, A2)] =
        Encoders.tuple[A1, A2](e1, e2)

...

我试图进行下一次加入:

val ds1 = someDataframe1.as[(String, T)].map(row => Data(row._1, row._2))
val ds1 = someDataframe2.as[(String, T)].map(row => Data(row._1, row._2))
ds1.joinWith(ds2, col("field1") === col("field1"), "left_outer")

之后我得到了下一个例外:

org.apache.spark.sql.AnalysisException: cannot resolve 'field1' given input columns: [value, value];

我的数据集中的列名发生了什么变化?

UPD : 当我打电话给ds1.schema时,我得到了下一个输出:

StructField(name = value,dataType = BinaryType, nullable = true)

我认为我有kryo序列化的问题(没有模式元数据,案例类被序列化为单个blob字段而没有名称)。另外我注意到,当T是kryo已知类(Int,String)或case类时,一切正常。但是当T是某个Java bean时,我将我的Data数据集模式作为单个blob未命名字段。

Spark版本1.6.1

1 个答案:

答案 0 :(得分:0)

您刚刚创建了一个只有一个列类型数据的数据集,并且您无法访问此对象中的字段(fields1)。

dataframe: |value|
           |------
           |Data |
           |------
           |Data |
           |------

您可以尝试将数据框转换为dataest: val ds1 = someDataframe1.as [Data]

dataframe: |field1|field2|
           |------
           |String|  T   |
           |------
           |String|  T   |
           |------

或者,如果您仍想使用数据框,请尝试更改搜索条件:

ds.joinWith(ds2, df.col("value").field1 === df2.col("value").field2)