使用pySpark迭代数据帧的每一行

时间:2017-01-30 09:01:14

标签: python dataframe iteration pyspark spark-dataframe

我需要使用pySpark迭代dataframe,就像我们可以使用for循环迭代一组值一样。以下是我编写的代码。这段代码的问题是

  1. 我必须使用破坏并行性的收集
  2. 我无法在函数funcRowIter
  3. 中打印DataFrame中的任何值
  4. 找到匹配后,我无法打破循环。
  5. 我必须在pySpark中执行此操作,并且不能使用pandas:

    from pyspark.sql.functions import *
    from pyspark.sql import HiveContext
    from pyspark.sql import functions
    from pyspark.sql import DataFrameWriter
    from pyspark.sql.readwriter import DataFrameWriter
    from pyspark import SparkContext
    
    sc = SparkContext()
    hive_context = HiveContext(sc)
    
    tab = hive_context.sql("select * from update_poc.test_table_a")
    
    tab.registerTempTable("tab")
    print type(tab)
    
    df = tab.rdd
    
    def funcRowIter(rows):
        print type(rows)
            if(rows.id == "1"):
                return 1
    
    df_1 = df.map(funcRowIter).collect()
    print df_1
    

2 个答案:

答案 0 :(得分:1)

似乎您的目标是显示特定的行。 您可以使用.filter,然后使用.collect

例如,

row_1 = rdd.filter(lambda x: x.id==1).collect()

但是,尝试以这种方式迭代数据帧会有效率。

答案 1 :(得分:0)

您应该尝试使用UDF,而不是使用df_1 = df.map(funcRowIter).collect()。希望这会有所帮助。

from pyspark.sql.functions import struct
from pyspark.sql.functions import *
def funcRowIter(rows):
    print type(rows)
    if(row is nor None and row.id is not None)
        if(rows.id == "1"):
            return 1
A = udf(funcRowIter, ArrayType(StringType()))
z = df.withColumn(data_id, A(struct([df[x] for x in df.columns])))
z.show()

collect()永远不会是大数据的好选择,即数百万条记录