Spark SQL中如何将空数组转为空字符串数组解决类型推断报错
问题说明
需求为在SQL查询语句内实现将空数组强制转换为字符串类型空数组,已知NULL可直接强制转换为字符串类型。执行以下代码片段时会抛出ValueError:Some of types cannot be determined after inferring
df = spark.sql("select Array()").collect() display(df)
报错原因
Spark SQL执行Array()方法创建空数组时,没有传入任何元素作为类型推断依据,引擎无法自动判定数组的元素类型,最终触发类型推断失败异常。
解决方法
在SQL语句内显式声明空数组的元素类型为字符串即可,无需在DataFrame层面做额外转换,完全在SQL内实现需求:
- 推荐写法:直接对空数组做类型强转,写法简洁可读性高
对应SQL逻辑为将无类型的空数组强转为字符串数组类型:
替换原代码后可正常运行:SELECT CAST(Array() AS ARRAY<STRING>) AS empty_string_array
运行后返回的结果即为字符串类型的空数组,不会触发类型推断报错。df = spark.sql("SELECT CAST(Array() AS ARRAY<STRING>) AS empty_string_array").collect() display(df) - 备选写法:创建带显式类型NULL的数组后返回空结果
也可以通过传入强转为字符串类型的NULL作为数组元素,再通过恒不成立的条件过滤元素得到空数组,写法相对冗余:SELECT ARRAY(CAST(NULL AS STRING)) WHERE 1 = 2
内容的提问来源于stack exchange,提问作者Ronnis
相关产品推荐
相关产品推荐

