Snowflake中varchar列parse_json报unknown keyword "None"问题咨询
问题描述
我已将如下数据行导入至目标表的varchar类型列 breakdown 中:
[{'platform': 'facebook', 'total': 20701, 'likes': 10106, 'shares': 3774, 'comments': 6168, 'tweets': None, 'favorites': None, 'hahas': 375, 'wows': 164, 'loves': 31, 'sads': 21, 'angrys': 62}] [{'platform': 'facebook', 'total': 15958, 'likes': 7206, 'shares': 2931, 'comments': 541, 'tweets': None, 'favorites': None, 'hahas': 62, 'wows': 852, 'loves': 145, 'sads': 1968, 'angrys': 2253}]
执行如下SQL尝试将列内存储的字典拆解为独立字段时,出现解析报错:
with org_table as ( select loaded_date, parse_json(breakdown) as CUSTOM_FIELDS from my_table) select CUSTOM_FIELDS:platform::string as platform from org_table
报错信息如下:
Error parsing JSON: unknown keyword "None", pos 107
当前该表使用的文件格式配置如下,咨询是否可以通过调整该配置解决上述问题:
"type": 'csv', "field_delimiter": ',', "EMPTY_FIELD_AS_NULL": True, 'escape_unenclosed_field': None, 'date_format': 'YYYY-MM-DD', 'skip_header': 1, 'escape': 'None', 'FIELD_OPTIONALLY_ENCLOSED_BY': '"', 'error_on_column_count_mismatch': False, 'NULL_IF': ('NULL', '', ' ', 'NULL', 'NULL', '//N', '\N'), 'RECORD_DELIMITER': '\n'
解答
调整建表时的CSV文件格式配置无法解决这个问题。
- 报错根源是存入
breakdown列的内容不是标准JSON:标准JSON要求空值写为小写null、字符串必须使用双引号包裹,当前导入的内容是Python字典的字符串输出结果,用单引号包裹字符串、用Python专属的None表示空值,parse_json仅能识别标准JSON语法,因此抛出未知关键字错误。 - CSV文件格式配置仅在数据导入阶段的字段切分、转义处理、空值识别环节生效,不会自动修改已经写入varchar列的字符串内容,也不具备自动将Python字典格式转换为标准JSON的能力。
- 可通过以下两种方案修复问题:
- 源端预处理:导入数据前先将源内容里的单引号替换为双引号、
None替换为null,转换为标准JSON格式后再入库,后续可直接正常解析。 - SQL侧预处理后解析:调用
parse_json前先替换字符串中的非法JSON语法,另外注意存储的内容是数组包裹的字典,取字段时需要加数组下标,参考SQL如下:with org_table as ( select loaded_date, parse_json( replace(replace(breakdown, '\'', '"'), 'None', 'null') ) as CUSTOM_FIELDS from my_table) select CUSTOM_FIELDS[0]:platform::string as platform from org_table
- 源端预处理:导入数据前先将源内容里的单引号替换为双引号、
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

