当前位置: 首页 > 知识库问答 >
问题:

如何将spark行(StructType)强制转换为scala case类

淳于亦
2023-03-14

我试图用scala编写一个udf函数,并在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)

在这个map函数中,我试图将行强制转换为case类,但无法。我犯了这个错误。

java.lang.ClassCast异常:org.apache.spark.sql.catalyst.expressions.GenericRowwith模式不能强制转换为变量计算变量计算$myRow3美元

有人能帮我吗?我该怎么解决这个问题?

共有1个答案

印宏阔
2023-03-14

问题是. asonRow只做一个类型转换,没有别的。

所以行。getAs[WrappedArray[Row]](“trips”)将起作用。然后你可以在它上面映射,并从构建myRow

您可能可以使用SparksEncoder自动执行此操作,但它们更适用于整个数据集。

您是否考虑过为整个模式制定一个case类,然后只做dataframe。作为[MyCaseClass]?这将使您能够正确访问整个嵌套结构

 类似资料:
  • 我正在开发一个使用C/C++代码的Android库。 我显然有某种编码错误,只在运行时出错。 错误: 如果我正确理解,那么我应该能够将返回值强制转换为,然后能够将其分配给我的一个java类中的。然而,事实并非如此。 您将注意到,可以将强制转换为,因为我将其作为参数传入。通过执行c代码,我可以确认这是真的。 将转换/强制转换为的正确方法是什么?

  • 我的spark-submit命令是: ~/spark-2.1.1-bin-hadoop2.6/bin/spark-submit--主纱--部署模式客户端--驱动程序--内存4G--executor-memory 2G--executor-cores 4--类consumer.spark.sample~/sparkstreamingjob/log_testing.jar~/sparkstreamin

  • 我有一个这样的表,这个表中的所有用户只有两个特性 我想转换为

  • 我正在尝试从RDD[cassandraRow]创建一个数据帧。。但我不能,因为createDataframe(RDD[Row],schema:StructType)需要RDD[Row],而不是RDD[cassandraRow]。 我怎样才能做到这一点 根据这个问题的答案,如何在spark中将rdd对象转换为数据帧 (答案之一)关于在RDD[行]上使用toDF()从RDD获取数据帧的建议,对我来说并

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,