循环生成和执行命令不起作用

Loop to generate and execute commands doesn't work

我的 pyspark 脚本有以下代码。我正在尝试生成一个查询,并且每次都使用不同的 i 值 运行。查询应该 select 嵌套 JSON 元素并计算大小(即出现次数)。我计算这个是为了帮助我对最终的 table 进行单元测试,我使用 "explode" 功能

单独创建它
for i in range(1,10) : 
onerowDF = spark.sql("""SELECT items['responses'][i]['id'] as items_response_id, items['responses'][i]['name'] as responses_name FROM responses""")
onerowDf.select(size("items_response_id"), size("responses_name")).show()

我在 运行 时遇到错误:

AnalysisException: u"cannot resolve '`i`' given input columns: [hasMore, items, total]; line 1 pos 74;\n'Project [items#1.id AS items_id#149, items#1.responseTime AS items.responseTime#154, items#1.responses['i][id] AS items_response_id#150, items#1.responses['i][name] AS responses_name#151, items#1.responses['i][type] AS responses_type#152, items#1.responses['i][answers] AS responses_answers#153]\n+- SubqueryAlias responses\n   +- Relation[hasMore#0,items#1,total#2L] json\n"

我故意从上面的代码中删除了一些元素以使其更简单,这就是为什么错误列出的元素比我的代码更多。

那么,为什么我不能在每个查询和 运行 2 个语句中替换 I 的值并获得结果?

for i in range(1,10) : 
    onerowDF = spark.sql("SELECT items['responses']["+i+"]['id'] as items_response_id, 
           items['responses']["+i+"]['name'] as responses_name FROM responses")")
    onerowDf.select(size("+items_response_id+"), size("+responses_name+")).show()

确保连接变量。不要包含在字符串中。而不是让 "...i..." 确保你做 "..."+i+"...."。 如果你有另一个你正在使用的我可能是错的。但也要检查

 "onerowDf.select(size("+items_response_id+"), `size("+responses_name+")).show()"`

Python 如何知道字符串中的 i 指的是变量而不是简单的字母? Python 没有像 Bash.

那样复杂的插值规则

你必须把它说清楚。最简单的方法是使用 f 弦。

for i in range(1,10) : 
    onerowDF = spark.sql(f"""SELECT items['responses'][{i}]['id'] as items_response_id, 
           items['responses'][{i}]['name'] as responses_name FROM responses""")
    onerowDf.select(size("items_response_id"), size("responses_name")).show()