如何将数据框列传递给scala函数

Posted

技术标签:

【中文标题】如何将数据框列传递给scala函数【英文标题】:How to pass a dataframe column to scala function 【发布时间】:2020-02-25 06:34:34 【问题描述】:

我编写了一个 scala 函数,它将时间(HH:mm:ss.SSS) 转换为秒。首先它将忽略毫秒并且只需要(HH:mm:ss)并转换为秒(int)。在 spark-shell 中测试时效果很好。

def hoursToSeconds(a: Any): Int = 
 val sec = a.toString.split('.')
 val fields = sec(0).split(':')
 val creationSeconds = fields(0).toInt*3600 + fields(1).toInt*60 + fields(2).toInt
 return creationSeconds


print(hoursToSeconds("03:51:21.2550000"))
13881

我需要将此函数传递给我正在尝试使用 withColumn 方法的数据框列之一(运行),但出现错误类型不匹配,预期:列,实际字符串。任何帮助将不胜感激,有没有办法可以将 scala 函数传递给 udf,然后在 df.withColumn 中使用 udf。

df.printSchema
root
 |-- vin: string (nullable = true)
 |-- BeginOfDay: string (nullable = true)
 |-- Timezone: string (nullable = true)
 |-- Version: timestamp (nullable = true)
 |-- Running: string (nullable = true)
 |-- Idling: string (nullable = true)
 |-- Stopped: string (nullable = true)
 |-- dlLoadDate: string (nullable = false)

示例运行列值。

df.withColumn("running", hoursToSeconds(df("Running")

【问题讨论】:

【参考方案1】:

您可以使用以下语法为hoursToSeconds 函数创建一个udf:

val hoursToSecUdf = udf(hoursToSeconds _)

要在特定列上进一步使用它,可以使用以下语法:

df.withColumn("TimeInSeconds",hoursToSecUdf(col("running")))

【讨论】:

你能帮忙并建议如何处理这个***.com/questions/62036791/…

以上是关于如何将数据框列传递给scala函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个数据框中的列传递给 Haversine 函数?

如何使用 Spark 数据框列上的函数或方法使用 Scala 进行转换

在 pyspark 中,我想将值的数据帧列传递给函数并在该数据列中操作说,第 5 个值

如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数

如何使用 spark.sql 将表列传递给 rand 函数?

在将 pandas 数据框列传递给 scikit learn 回归器之前,是不是应该以某种方式对其进行转换?