插入SQL的集合列表格式异常,无法用于后续IN查询
问题根源
你插入数据时犯了个关键错误:没有把拼接好的括号字符串当成普通字符串值传入SQL,而是直接把它写进了SQL语法里。比如生成的SQL会是这样:
INSERT INTO db.help (keyword, stem_list) VALUES ('test', ('a','b'))
这里的('a','b')被SQL当成了行构造器(不是字符串),存到字符串类型的stem_list字段时,就被转成了带大括号的格式{a,b},自然没法直接用在IN查询里。
解决办法
方法1:给拼接好的字符串加单引号
直接在INSERT语句里把list_stems用单引号包起来,让SQL把它识别成字符串值:
list_stems = ", ".join(["'"+stem['label'].replace("'", "''")+"'" for stem in json_final[keyword]]) list_stems = f"({list_stems})" # 注意这里给{list_stems}加了单引号 query = "INSERT INTO {table_name} (keyword, stem_list) VALUES ('{keyword}', '{list_stems}')".format( table_name='db.help', keyword=keyword.replace("'", "''"), # 别忘了转义keyword里的单引号 list_stems=list_stems ) spark.sql(query)
提示:必须转义字符串里的单引号(换成两个单引号),不然遇到带单引号的内容会直接触发SQL语法错误。
方法2:用Spark DataFrame API插入(更安全,推荐)
别直接拼SQL字符串了,用DataFrame插入既避免SQL注入,又不用操心格式问题:
from pyspark.sql import Row # 先处理stem列表,转成带括号的字符串,同时转义单引号 processed_stems = ", ".join([f"'{stem['label'].replace(\"'\", \"''\")}'" for stem in json_final[keyword]]) stem_list_str = f"({processed_stems})" # 构造Row对象,转成DataFrame后追加到表中 spark.createDataFrame([Row(keyword=keyword, stem_list=stem_list_str)])\ .write.mode("append")\ .saveAsTable("db.help")
后续IN查询怎么用
插入正确格式的stem_list后,直接把字段值拼进IN语句就行:
# 先取出对应的stem_list stem_row = spark.sql(f"SELECT stem_list FROM db.help WHERE keyword = '{keyword.replace(\"'\", \"''\")}'").first() if stem_row: stem_list = stem_row["stem_list"] # 拼接查询语句 query = f"SELECT * FROM your_target_table WHERE your_column IN {stem_list}" result = spark.sql(query)
内容的提问来源于stack exchange,提问作者DBA_player
相关产品推荐
相关产品推荐

