Spark SQL中按日期分组聚合

我有一个包含时间戳名为RDD 长整型:

root

|-- id: string (nullable = true)

|-- value1: string (nullable = true)

|-- value2: string (nullable = true)

|-- time: long (nullable = true)

|-- type: string (nullable = true)

我正在尝试按值1,值2和时间分组为YYYY-MM-DD。我尝试按演员分组(时间为日期),但随后出现以下错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:40)

at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)

Caused by: java.lang.RuntimeException: [1.21] failure: ``DECIMAL'' expected but identifier Date found

这是否意味着无法按日期分组?我什至尝试添加另一级别的强制转换以将其作为字符串:

cast(cast(time as Date) as String)

哪个返回相同的错误。

我已经读到我可以在RDD上使用gregationByKey,但我不明白如何在几列中使用它并将其转换为YYYY-MM-DD字符串。我应该如何进行?

回答:

我通过添加以下功能解决了该问题:

def convert( time:Long ) : String = {

val sdf = new java.text.SimpleDateFormat("yyyy-MM-dd")

return sdf.format(new java.util.Date(time))

}

并将其注册到sqlContext中,如下所示:

sqlContext.registerFunction("convert", convert _)

然后,我终于可以按日期分组:

select * from table convert(time)

以上是 Spark SQL中按日期分组聚合 的全部内容, 来源链接: utcz.com/qa/413140.html

回到顶部