it-roy-ru.com

как перебрать каждую строку dataFrame в pyspark

Например

sqlContext = SQLContext(sc)

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

Вышеупомянутое утверждение печатает всю таблицу на терминале, но я хочу получить доступ к каждой строке в этой таблице, используя для или во время , чтобы выполнить дальнейшие вычисления.

24
Arti Berde

Вы должны определить пользовательскую функцию и использовать карту.

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, а не кадром данных.

Карта нужна, если вы собираетесь выполнять более сложные вычисления. Если вам просто нужно добавить производный столбец, вы можете использовать withColumn, который возвращает фрейм данных.

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

Вы просто не можете. DataFrames, как и другие распределенные структуры данных, не итерируемы и могут быть доступны только с помощью специальной функции более высокого порядка и/или методов SQL.

Вы можете, конечно, collect 

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

или конвертировать toLocalIterator 

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

и выполнять локальные итерации, как показано выше, но это превосходит все цели использования Spark.

21
zero323

Используя списки в 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"]))
6
aaronsteers

Если вы хотите что-то сделать с каждой строкой в ​​объекте DataFrame, используйте map. Это позволит вам выполнять дальнейшие вычисления для каждой строки. Это эквивалентно циклу по всему набору данных от 0 до len(dataset)-1

Обратите внимание, что это вернет PipelinedRDD, а не DataFrame. 

2
Katya Handler

Дай попробовать, как это

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

выше

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

должно быть 

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

для name, age и city являются не переменными, а просто ключами словаря.

1
ten2the6