Spark SQL数据类型不匹配求助:数组转字符串后提取失败
问题解决:Spark SQL数据类型不匹配错误
错误原因
你的代码中,SPLIT(CAST(log as STRING),' ',4)返回的是数组类型,将数组强制转为字符串后再次调用SPLIT,得到的仍是数组类型,但TRIM函数仅支持字符串输入,因此触发类型不匹配错误。
修正方案
方法1:使用element_at提取数组元素
先拆分log得到数组,提取目标元素后再拆分,避免数组转字符串的操作:
-- 提取server_launch_date TRIM(SPLIT(ELEMENT_AT(SPLIT(CAST(log AS STRING), ' '), 4), 'OpenLevel39', 2)) AS server_launch_date -- 计算服务器创建天数 DATEDIFF('day', DATE(TRIM(SPLIT(ELEMENT_AT(SPLIT(CAST(log AS STRING), ' '), 4), 'OpenLevel39', 2))), CURRENT_DATE) AS server_create_in_days
注:element_at函数支持从1开始计数数组元素,直接取第4部分。
方法2:用split_part简化操作(推荐)
split_part直接返回拆分后的指定部分字符串,无需处理数组,代码更简洁:
-- 提取server_launch_date TRIM(SPLIT_PART(SPLIT_PART(CAST(log AS STRING), ' ', 4), 'OpenLevel39', 2)) AS server_launch_date -- 计算服务器创建天数 DATEDIFF('day', DATE(TRIM(SPLIT_PART(SPLIT_PART(CAST(log AS STRING), ' ', 4), 'OpenLevel39', 2))), CURRENT_DATE) AS server_create_in_days
解释:
SPLIT_PART(CAST(log AS STRING), ' ', 4):将log转字符串后按空格拆分,取第4部分SPLIT_PART(..., 'OpenLevel39', 2):将上述结果按OpenLevel39拆分,取第2部分TRIM去除多余空格后转日期,用于计算天数
内容的提问来源于stack exchange,提问作者Khiêm Cao
相关产品推荐
相关产品推荐

