Python 使用pySpark迭代数据帧的每一行
我需要使用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
数据帧
,就像我们可以使用for循环迭代一组值一样。下面是我写的代码。这段代码的问题是
funcRowIter
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会破坏并行性