Spark 2.1 - Dataset API&二进制字段:如何获取原始字段值?

时间:2017-07-21 10:38:33

标签: apache-spark apache-spark-sql

  • Spark 2.1.1
  • Scala 2.11.8
  • Java 1.8.0_131(64位)
  • Linux Ubuntu 16.04 LTS

使用我的Spark应用程序,我想计算所有气象站一年中的平均温度。为此,我制作了这个RDD结构:

type TemperatureRecord = (LocalDate, Location, Double)

下面是我的数据样本:

  

{Tuple3 @ 9233}   "(1975年1月1日,地点(70.933,-8.667), - 4.888888888888889)"
  {Tuple3 @ 9234}   "(1976年1月1日,地点(70.933,-8.667), - 11.88888888888889)"
  {Tuple3 @ 9235}   "(1977年1月1日,地点(70.933,-8.667), - 13.61111111111111)"

我通过这种方式将RDD转换为数据集:

val ds = rdd.toDF("date", "location", "temperature").as[TemperatureRecord]

要存储我的日期,我必须使用 java.time.LocalDate 类型,因此,我添加以下隐式转换(否则,数据集无法转换并抛出错误:找不到java.time.LocalDate的编码器)。

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

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

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

下面是数据集架构:

root
 |-- date: binary (nullable = true)
 |-- location: struct (nullable = true)
 |    |-- latitude: double (nullable = true)
 |    |-- longitude: double (nullable = true)
 |-- temperature: double (nullable = true)

数据样本:

+--------------------+---------------+--------------------+
|                date|       location|         temperature|
+--------------------+---------------+--------------------+
|[01 00 6A 61 76 6...|[70.933,-8.667]|  -4.888888888888889|
|[01 00 6A 61 76 6...|[70.933,-8.667]|  -11.88888888888889|
|[01 00 6A 61 76 6...|[70.933,-8.667]|  -13.61111111111111|

现在我的日期是二进制格式,我的问题是我丢失了原始日期值。我能为我的领域做些什么" date"给我原始值(即日期)

0 个答案:

没有答案