как привести искровой ряд (StructType) к классу случая Scala - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь написать функцию udf в scala и использовать ее в своей работе pyspark.моя схема данных

root
|-- vehicle_id: string
|-- driver_id: string
|-- StartDtLocal: timestamp
|-- EndDtLocal: timestamp
|-- trips: array
|    |-- element: struct
|    |    |-- week_start_dt_local: timestamp
|    |    |-- week_end_dt_local: timestamp
|    |    |-- start_dt_local: timestamp
|    |    |-- end_dt_local: timestamp
|    |    |-- StartDtLocal: timestamp
|    |    |-- EndDtLocal: timestamp
|    |    |-- vehicle_id: string
|    |    |-- duration_sec: float
|    |    |-- distance_km: float
|    |    |-- speed_distance_ratio: float
|    |    |-- speed_duration_ratio: float
|    |    |-- speed_event_distance_km: float
|    |    |-- speed_event_duration_sec: float
|-- trip_details: array
|    |-- element: struct
|    |    |-- event_start_dt_local: timestamp
|    |    |-- force: float
|    |    |-- speed: float
|    |    |-- sec_from_start: float
|    |    |-- sec_from_end: float
|    |    |-- StartDtLocal: timestamp
|    |    |-- EndDtLocal: timestamp
|    |    |-- vehicle_id: string
|    |    |-- trip_duration_sec: float

я пытаюсь написать функцию udf

def calculateVariables(row: Row):HashMap[String, Float] = {
    case class myRow(week_start_dt_local: Timestamp, week_end_dt_local: Timestamp, start_dt_local: Timestamp, end_dt_local :Timestamp, StartDtLocal:Timestamp,EndDtLocal:Timestamp,vehicle_id:String,duration_sec:Int,distance_km:Int,speed_distance_ratio:Float,speed_duration_ratio:Float,speed_event_distance_km:Float,speed_event_duration_sec:Float)

val trips = row.getAs[WrappedArray[myRow]](4)

в этой функции карты, я пытаюсь привести строку к классу дела, но не могу.получаю эту ошибку

Может кто-нибудь помочь мне, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 13 декабря 2018

Проблема в том, что .as на Row просто ничего не делает.внутренний тип trips на самом деле Row

, поэтому row.getAs[WrappedArray[Row]]("trips") будет работать.тогда вы можете map над ним и построить myRow из Row.

Вы, вероятно, могли бы сделать это как-то автоматически, используя Sparks Encoder, но они больше предназначены для применения ко всему набору данных.

рассматривали ли вы вопрос о создании класса case для всей схемы, а затем просто выполните dataframe.as[MyCaseClass]?это даст вам правильный доступ ко всей вложенной структуре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...