使用dataframe中的值作为字符串调用pyspark中的函数
我必须调用一个函数使用dataframe中的值作为字符串调用pyspark中的函数,pyspark,pyspark-sql,pyspark-dataframes,Pyspark,Pyspark Sql,Pyspark Dataframes,我必须调用一个函数func_test(spark,a,b),它接受两个字符串值并从中创建一个dfspark是一个SparkSession变量 这两个字符串值是另一个数据帧的两列,并且对于该数据帧的不同行来说是不同的 我无法做到这一点 迄今为止尝试过的事情: 一, 仅给出了CTRY和CITY的首个df记录 二, 将列和列作为值提供 例如: df是: 所以,我想首先调用fetchfunc_test(spark,US,LA);第二次调用gofunc_测试(spark,UK,LN);第三个调用是func
func_test(spark,a,b)
,它接受两个字符串值并从中创建一个dfspark
是一个SparkSession
变量
这两个字符串值是另一个数据帧的两列,并且对于该数据帧的不同行来说是不同的
我无法做到这一点
迄今为止尝试过的事情:一, 仅给出了CTRY和CITY的首个df记录 二, 将
列
和列
作为值提供
例如:
df是:
所以,我想首先调用fetchfunc_test(spark,US,LA)
;第二次调用gofunc_测试(spark,UK,LN)
;第三个调用是func\u测试(spark、SN、SN)
等等
Pyspark - 3.7
Spark - 2.2
编辑1:
详情如下:
func_test(spark、string1、string2)
是一个接受两个字符串值的函数。此函数中包含一组完成的各种数据帧操作。例如:-func_测试中的First spark sql是一个普通的select,这两个变量string1和string2在where子句中使用。生成df的spark sql的结果是下一个spark sql的临时表,依此类推。最后,它创建一个df,该函数func_test(spark,string1,string2)
返回该df
现在,在main类中,我必须调用这个func_测试,两个参数string1和string2将从dataframe的记录中获取。所以,第一个func_测试调用将从CTRY='US'和CITY='LA'所在的dummy生成查询,作为select*。随后的操作会导致df。对func_测试的第二次调用变为select*from dummy,其中CTRY='UK'和CITY='LN'
。第三个调用变成select*from dummy,其中CTRY='SN'和CITY='SN'
等等。而不是first()
使用collect()
并迭代循环
Pyspark - 3.7
Spark - 2.2
collect_vals = df.select('CTRY','CITY').distinct().collect()
for row_col in collect_vals:
func_test(spark, row_col['CTRY'],row_col['CITY'])
希望这有帮助 我没有完全理解你的问题,但我认为你想在另一个2列值上按函数定义新列,对吗?不,我不想创建新列。我想创建一个新的数据帧ctry_df,它与df没有任何关系。但是ctry_df必须具有由func_test(a,b)执行的操作结果的列。是否要使用相同的架构创建新的数据帧?架构将与新的数据帧不同。如果不清楚,我可以试着用更详细的形式解释这个问题。是的,我认为它很复杂。为什么我们需要在这里明确?CTRY和CITY的组合也可以在df的其他行中重复。现在它可以接近预期工作。谢谢,我假设您需要使用单一组合一次。但如果您不想重复数据消除,则不需要使用distinct。继续此操作时需要一个输入:-在第一次调用CTRY和CITY时,返回df(一行)。下一次呼叫下一个中心和城市时,返回下一个df(另一行)。有没有一种方法可以将所有这些df一个一个地堆叠起来,并创建一个最终的df(或一个临时表),其末尾有尽可能多的行?您只需从返回过滤值的位置与df进行连接即可。加入同一个关键国家和城市。
Pyspark - 3.7
Spark - 2.2
collect_vals = df.select('CTRY','CITY').distinct().collect()
for row_col in collect_vals:
func_test(spark, row_col['CTRY'],row_col['CITY'])