如何在pyspark中映射for循环中一行的单列值

时间:2017-01-10 06:06:22

标签: apache-spark pyspark pyspark-sql

from pyspark.sql import HiveContext  
hive_context = HiveContext(sc)  
test = hive_context.table("dbname.tablename")    
iterate = test.map(lambda p:(p.survey_date,p.pro_catg,p.metric_id))  
 for ite in iterate.collect() :       
   v = ite.map(lambda p:p.metric_id) 
   print (v)  

上面的代码在for循环中给出了错误。如何在不改变上面的映射的情况下打印单个列,因为我希望将代码编写为

for ite in iterate.collect():  
   for ite11 in secondtable.collect() :   
       if ite.metric_id.find(ite11.column1)  
         result.append(ite , ite11)   

请帮忙解决这个问题

2 个答案:

答案 0 :(得分:0)

运行时出错的原因:

for ite in iterate.collect() :       
   v = ite.map(lambda p:p.metric_id) 

iterate.collect()的结果不是RDD,它是一个python列表(或类似的东西)。

map可以在RDD上执行,不能在python-list上执行。

一般情况下,{@ 1}}不建议在spark

中使用

以下应该执行类似的操作而不会出错:

collect()

答案 1 :(得分:0)

最后我得到了另一个解决方案,将for循环中的单列值映射为

for ite in iterate.collect():
  for itp in prod.collect():    
    if itp[0] in ite[1]: result.append(p)   
print(result)  

工作正常。我们可以使用in作为

而不是find
if ite[1].find(itp[0]): result.append(p)