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

Python 使用pySpark迭代数据帧的每一行,python,dataframe,iteration,pyspark,spark-dataframe,Python,Dataframe,Iteration,Pyspark,Spark Dataframe,我需要使用pySpark迭代数据帧,就像我们可以使用for循环迭代一组值一样。下面是我写的代码。这段代码的问题是 我必须使用collect,这会破坏并行性 我无法在函数funcRowIter 一旦找到匹配项,我就无法打破循环 我必须在pySpark中执行此操作,不能使用pandas: from pyspark.sql.functions import * from pyspark.sql import HiveContext from pyspark.sql import functions f

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

  • 我必须使用collect,这会破坏并行性
  • 我无法在函数
    funcRowIter
  • 一旦找到匹配项,我就无法打破循环
  • 我必须在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
    

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

    比如说,

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

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

    您应该尝试使用UDF,而不是使用
    df_1=df.map(functrowiter).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()
    永远都不是非常大的数据(即数百万条记录)的好选择

    我试图在没有collect()的情况下完成这项工作,因为collect会破坏并行性