如何在 Spark Databricks 中注册 SQL 函数

Posted

技术标签:

【中文标题】如何在 Spark Databricks 中注册 SQL 函数【英文标题】:How register a SQL Function in Spark Databricks 【发布时间】:2019-08-11 11:03:10 【问题描述】:

我已经编写了将在 Spark 中使用的 SQL 代码。该代码在 MS Server 上的 T-SQL 中应用时工作正常,但是当我运行将代码应用到 Spark 平台时,我收到错误:Undefined function: 'EOMONTH'。此函数既不是注册的临时函数,也不是在数据库“默认”中注册的永久函数。 我认为问题是我需要注册 T-SQL 函数 EOMONTH,但是我不知道该怎么做。

我已尝试使用以下方法注册该功能;

sqlContext.sql("""CREATE TEMPORARY FUNCTION function_name AS 'EOMONTH'"""),

但我得到了错误:

注册函数'function_name'时无法加载类'EOMONTH',请确保它在类路径中;

完整代码如下:

SELECT     MakeName, SUM(Cost) AS TotalCost
FROM       Make AS MK INNER JOIN Model AS MD 
           ON MK.MakeID = MD.MakeID
INNER JOIN Stock AS ST ON ST.ModelID = MD.ModelID
WHERE      DateBought BETWEEN 
           CAST(YEAR(DATE_ADD(m, -1, CURRENT_DATE())) AS CHAR(4)) 
           + RIGHT('0' + CAST(MONTH(DATE_ADD(m, -1, CURRENT_DATE())) 
           AS VARCHAR(2)),2) + '01'
           AND EOMONTH(DATE_ADD(m, -1, CURRENT_DATE()))
GROUP BY   MakeName

我应该只从查询中得到结果

【问题讨论】:

【参考方案1】:

使用last_day 而不是eomonth,即

FROM       Make AS MK INNER JOIN Model AS MD 
           ON MK.MakeID = MD.MakeID
INNER JOIN Stock AS ST ON ST.ModelID = MD.ModelID
WHERE      DateBought BETWEEN 
           CAST(YEAR(DATE_ADD(m, -1, CURRENT_DATE())) AS CHAR(4)) 
           + RIGHT('0' + CAST(MONTH(DATE_ADD(m, -1, CURRENT_DATE())) 
           AS VARCHAR(2)),2) + '01'
           AND LAST_DAY(DATE_ADD(m, -1, CURRENT_DATE()))
GROUP BY   MakeName

【讨论】:

【参考方案2】:

Spark SQL 与 SQL Server T-SQL 不同。 Spark SQL 中没有EOMONTH 函数。但是,有一个您可以使用的last_day() 函数。

> SELECT last_day('2019-08-11');
 2019-08-31

这也可以通过 PySpark 访问(请参阅 Stack Overflow 答案 here)。

【讨论】:

好的,太好了,我会试试你的建议,让你知道我的进展如何。 输入了 last_day,但是,我现在收到错误'nvalid number of arguments for function add_months。预期:2;找到:1;。但是,如果您查看代码,我肯定输入了两个参数“(DATE_ADD(CURRENT_DATE(),-1))”。如果我遗漏了什么,有人可以告诉我test5 = spark.sql("""SELECT TRX_EVENT_END AS TRX_EVENT ,SALES_QUANTITY FROM Transactions WHERE TRX_EVENT_END BETWEEN CAST(YEAR(DATE_ADD(CURRENT_DATE(),-1)) AS CHAR(4))+ RIGHT('0' + CAST(ADD_MONTHS(DATE_ADD(CURRENT_DATE(),-1))AS VARCHAR(2)),2) + '01'AND LAST_DAY(DATE_ADD(CURRENT_DATE(),-1))""") @Carltonp - 请编辑您的问题以包含您在此处包含的代码。作为评论,恐怕这样的代码是不可读的(全部在一行上,没有缩进)。您可以编辑您的问题以显示您尝试过的内容、其他错误等。 嗨大卫,代码如下,test5 = spark.sql("""SELECT TRX_EVENT_END AS TRX_EVENT ,SALES_QUANTITY FROM Transactions WHERE TRX_EVENT_END BETWEEN CAST(YEAR(DATE_ADD(CURRENT_DATE(),-1)) AS CHAR(4))+ RIGHT('0' + CAST(ADD_MONTHS(DATE_ADD(CURRENT_DATE(),-1))AS VARCHAR(2)),2) + '01'AND LAST_DAY(DATE_ADD(CURRENT_DATE(),-1))""")这样可以吗?

以上是关于如何在 Spark Databricks 中注册 SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章

企业版Spark Databricks + 企业版Kafka Confluent 联合高效挖掘数据价值

Azure Databricks:如何在 Databricks 群集中添加 Spark 配置

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

Databricks/Spark SQL - 如何在地图类型字段中获取数据

如何使用 databricks-connect 在本地执行 Spark 代码?

spark sql如何在databricks中创建表