簡體   English   中英

如何遍歷pyspark中的每一行dataFrame

[英]How to loop through each row of dataFrame in pyspark

例如

sqlContext = SQLContext(sc)

sample=sqlContext.sql("select Name ,age ,city from user")
sample.show()

上面的語句在終端上打印整個表。 但我想使用forwhile訪問該表中的每一行以執行進一步的計算。

你根本不能。 DataFrames與其他分布式數據結構一樣,不可迭代,只能使用專用的高階函數和/或 SQL 方法訪問。

你當然可以collect

for row in df.rdd.collect():
    do_something(row)

或轉換為toLocalIterator

for row in df.rdd.toLocalIterator():
    do_something(row)

並在本地進行迭代,如上所示,但它超越了使用 Spark 的所有目的。

要“循環”並利用 Spark 的並行計算框架,您可以定義自定義函數並使用 map。

def customFunction(row):

   return (row.name, row.age, row.city)

sample2 = sample.rdd.map(customFunction)

sample2 = sample.rdd.map(lambda x: (x.name, x.age, x.city))

然后將自定義函數應用於數據幀的每一行。 請注意, sample2 將是RDD ,而不是數據幀。

如果您要執行更復雜的計算,則可能需要 Map。 如果您只需要添加一個簡單的派生列,您可以使用withColumn ,並返回一個數據withColumn

sample3 = sample.withColumn('age2', sample.age + 2)

在 Python 中使用列表推導式,您只需使用兩行就可以將一整列值收集到一個列表中:

df = sqlContext.sql("show tables in default")
tableList = [x["tableName"] for x in df.rdd.collect()]

在上面的示例中,我們返回數據庫“default”中的表列表,但可以通過替換 sql() 中使用的查詢來調整相同的表。

或者更縮寫:

tableList = [x["tableName"] for x in sqlContext.sql("show tables in default").rdd.collect()]

對於您的三列示例,我們可以創建一個字典列表,然后在 for 循環中遍歷它們。

sql_text = "select name, age, city from user"
tupleList = [{name:x["name"], age:x["age"], city:x["city"]} 
             for x in sqlContext.sql(sql_text).rdd.collect()]
for row in tupleList:
    print("{} is a {} year old from {}".format(
        row["name"],
        row["age"],
        row["city"]))

像這樣試一試

    result = spark.createDataFrame([('SpeciesId','int'), ('SpeciesName','string')],["col_name", "data_type"]); 
    for f in result.collect(): 
        print (f.col_name)

如果您想對 DataFrame 對象中的每一行執行某些操作,請使用map 這將允許您對每一行執行進一步的計算。 這相當於從0len(dataset)-1遍歷整個數據len(dataset)-1

請注意,這將返回一個 PipelinedRDD,而不是一個 DataFrame。

這可能不是最佳實踐,但您可以簡單地使用collect()定位特定列,將其導出為行列表,然后遍歷列表。

假設這是您的 df:

+----------+----------+-------------------+-----------+-----------+------------------+ 
|      Date|  New_Date|      New_Timestamp|date_sub_10|date_add_10|time_diff_from_now|
+----------+----------+-------------------+-----------+-----------+------------------+ 
|2020-09-23|2020-09-23|2020-09-23 00:00:00| 2020-09-13| 2020-10-03| 51148            | 
|2020-09-24|2020-09-24|2020-09-24 00:00:00| 2020-09-14| 2020-10-04| -35252           |
|2020-01-25|2020-01-25|2020-01-25 00:00:00| 2020-01-15| 2020-02-04| 20963548         |
|2020-01-11|2020-01-11|2020-01-11 00:00:00| 2020-01-01| 2020-01-21| 22173148         |
+----------+----------+-------------------+-----------+-----------+------------------+

循環遍歷日期列中的行:

rows = df3.select('Date').collect()

final_list = []
for i in rows:
    final_list.append(i[0])

print(final_list)

以上

tupleList = [{name:x["name"], age:x["age"], city:x["city"]} 

應該是

tupleList = [{'name':x["name"], 'age':x["age"], 'city':x["city"]} 

因為nameagecity不是變量,而只是字典的鍵。

我不確定在撰寫本文時這是否不可能,但是有多種方法可以通過 spark DataFrame 進行迭代,請參閱此處的所有文檔: https ://sparkbyexamples.com/pyspark/pyspark-loop-iterate -通過數據幀中的行/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM