我有一个列,它有时是一个字符串,有时是一个带有单个元素的字符串数组。不幸的是,我没有办法改变这种行为,所以它总是只有一种数据类型。
当列是数组时,我需要选择它的第一个元素,当它包含一个字符串时,我需要选择另一个列。
当我这么做时:
SELECT IFNULL(`myColumn`[0],`myOtherColumn`) FROM myTable如果myColumn是一个字符串,它将抛出:
org.apache.spark.sql.AnalysisException:无法从myColumn#691中提取值:需要结构类型但得到字符串
我签出了方法,但是afaik只适用于来自java库的静态方法,所以我不能使用isArray或其他实例方法。
是否有一种方法可以根据列数据类型有条件地选择列?
发布于 2020-12-26 13:46:27
我想不出在什么时候将列类型检查放到一个案例中,但是这里有一个可以工作的黑客:
select
case when (substring(cast(myColumn as string), 1, 1) = '[') and
(substring(cast(myColumn as string), -1, 1) = ']')
then split(trim(both '[]' from cast(myColumn as string)), ',')[0]
else myOtherColumn
end
from myTable;当然,如果字符串以[开头或以]结尾,这可能会失败。如果您可以使用pyspark/scala,您可以通过检查列类型以一种更可靠的方式来做到这一点。
https://stackoverflow.com/questions/65456506
复制相似问题