使用我的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"给我原始值(即日期)