【发布时间】:2019-09-18 14:18:14
【问题描述】:
我正在寻找查询的等效数据块代码。 我添加了一些示例代码和预期的代码,但特别是我正在 Databricks 中为 query 寻找等效代码。目前我被困在 CROSS APPLY STRING SPLIT 部分。
示例 SQL 数据:
CREATE TABLE FactTurnover
(
ID INT,
SalesPriceExcl NUMERIC (9,4),
Discount VARCHAR(100)
)
INSERT INTO FactTurnover
VALUES
(1, 100, '10'),
(2, 39.5877, '58, 12'),
(3, 100, '50, 10, 15'),
(4, 100, 'B')
查询:
;WITH CTE AS
(
SELECT Id, SalesPriceExcl,
CASE WHEN value = 'B' THEN 0
ELSE CAST(value as int) END AS Discount
From FactTurnover
CROSS APPLY STRING_SPLIT(Discount, ',')
)
SELECT Id,
Min(SalesPriceExcl) AS SalesPriceExcludingDiscount,
EXP(SUM(LOG((100 - Discount) / 100.0))) As TotalDiscount,
Cast(EXP(SUM(LOG((100 - Discount) / 100.0))) *
MIN(SalesPriceExcl) As Numeric(9,2))
PriceAfterDiscount
FROM CTE
GROUP BY ID
预期结果:
| Id | SalesPriceExcludingDiscount | TotalDiscount | PriceAfterDiscount |
|----|-----------------------------|---------------------|--------------------|
| 1 | 100 | 0.9 | 90 |
| 2 | 39.5877 | 0.36960000000000004 | 14.63 |
| 3 | 100 | 0.38250000000000006 | 38.25 |
| 4 | 100 | 1 | 100 |
【问题讨论】:
-
有什么问题? Databricks 支持 SQL,对吗?
-
是的,但如果您在 Databricks 中使用它,则并非每个命令都能被识别。当您使用 %sql 启动命令时,它无法识别所有功能。交叉申请就是其中之一。
-
@kjmerf 我想只有Spark SQL,所以你不能在里面复制粘贴其他sql方言
-
确实如此。就是这样。它是我正在寻找的 Spark 等价物。
-
您需要使用拆分和分解。像
discounts.withColumn("SalesPriceExcl",explode(split($"SalesPriceExcl",",")))这样的东西。这将为数组中的每个值提供一行,它基本上应该替换交叉应用
标签: sql apache-spark-sql databricks azure-databricks