Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成和执行命令的循环无效_Python_Loops_Pyspark_Apache Spark Sql_Code Generation - Fatal编程技术网

Python 生成和执行命令的循环无效

Python 生成和执行命令的循环无效,python,loops,pyspark,apache-spark-sql,code-generation,Python,Loops,Pyspark,Apache Spark Sql,Code Generation,我的pyspark脚本有以下代码。我试图生成一个查询,每次都用不同的I值运行它。查询应选择嵌套的JSON元素并计算大小,即出现的次数。我计算它是为了帮助我对最终的表进行单元测试,我将使用explode功能单独创建该表 for i in range(1,10) : onerowDF = spark.sql("""SELECT items['responses'][i]['id'] as items_response_id, items['responses'][i]['name'] as res

我的pyspark脚本有以下代码。我试图生成一个查询,每次都用不同的I值运行它。查询应选择嵌套的JSON元素并计算大小,即出现的次数。我计算它是为了帮助我对最终的表进行单元测试,我将使用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"
我已经故意从上面的代码中删除了一些元素,以使其更简单,这就是为什么错误在这里列出的元素比我的代码多

那么为什么我不能在每个查询中替换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()

您的示例代码格式不正确。有一个字符串跨越两行,引号为奇数。你的问题问得越清楚,你就越有可能得到一个好的答案。我正试图删除其他表达式以使其看起来更干净,这是导致格式错误的原因,我将编辑代码以删除格式错误。它的格式仍然不正确。试着运行它。我做了另一次编辑。我在SELECT查询周围添加了3个双引号,以确保多行不会导致console中的EOL错误。现在唯一的错误是我第一次遇到的故意错误,这也是最初的问题。