如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误
Posted
技术标签:
【中文标题】如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误【英文标题】:How to fix "Cannot use null as map key!" error in Spark.SQL with Python 3 using Group_Map 【发布时间】:2019-02-12 14:32:21 【问题描述】:我正在使用 Spark.SQL,我正在尝试使用 MAP 语句创建一个数据透视表,以便将一列的值作为不同的列。
我用这个查询准备了第一个表:
spark.sql("""CREATE TABLE TABLE_01 STORED AS PARQUET AS
select
ROWS,
COLUMNS,
count(*) as NUM_ROWS
from TABLE_00
group by ROWS, COLUMNS
order by ROWS, COLUMNS
""")
这个想法是这样转换的:
ROWS COLUMNS NUM_ROWS
VALUE1 COL2 2
VALUE1 COL3 50
VALUE2 COL1 20
VALUE2 COL2 1
VALUE2 COL3 30
进入这个:
COLUMNS
COL1 | COL2 | COL3
ROWS
------------------------------------------------------
VALUE1 0 (The problem) | 2 | 50
VALUE2 20 | 1 | 30
我在 Python2 中有一个查询,它曾经可以工作,但现在我必须更改为 Python3,我快疯了。查询是:
spark.sql("""CREATE TABLE TABLE_02 STORED AS PARQUET AS
select
a.ROWS,
coalesce(sum(a.group_map['COL1']),0) as COL1,
coalesce(sum(a.group_map['COL2']),0) as COL2,
coalesce(sum(a.group_map['COL3']),0) as COL3
from
(
select ROWS, map(COLUMNS,NUM_ROWS) as group_map
from TABLE_01
) a
group by a.ROWS
""")
输出为:java.lang.RuntimeException: Cannot use null as map key!
有什么帮助吗?为什么它适用于 Python2?
谢谢!
【问题讨论】:
看看***.com/a/39121638/4777984 【参考方案1】:您正在尝试定义一个缺失值,在本例中为 VALUE1、COL1。空值不是返回Null
值的正确方法,您需要将其定义为None
。所以你要做的就是将VALUE1,COL1定义为None
。
【讨论】:
你能告诉我更多细节吗? 现在我看到了你的错误。忘记dict
,我会编辑我的答案。在 SQL 中,您需要定义一个“无”值,而不仅仅是放置一个缺失的对象,在您的情况下:VALUE 1,COL1。您需要将其定义为无。
怎么样?我需要将 None 值作为所有值的默认值,因为它必须准备好在任何地方找到 null。你知道怎么做吗?谢谢!
如果他们找到它,他们将返回空值,但你需要为 VALUE 1,COL1 定义一些东西,因为它理解为一个空值。
如您所见,原始表不包含 COLS 和 ROWS 之间的所有可能组合。我无法将缺少的组合转换为某些东西。我根本没有值为 COL1、VALUE1 的行。如何映射该值?【参考方案2】:
理想情况下,您正在查看数据透视,而不是为此手动编写代码,您可以尝试下面的代码块
df
.groupBy($"<column name>", .. <columns to be grouped, here VALUE1, VALUE2,...>)
.pivot("<column name>",...<columns to pivot, here COL1, COL2, ...>)
.agg(<aggreagation expressions..>)
【讨论】:
以上是关于如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章