如何在 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 - 如何在地图类型字段中获取数据