2016-04-01 6 views
10

Örni için <strong>kullanarak o tablodaki her satır erişmeye veya</strong> ise daha fazla hesaplama yapmak istiyorum nasıl pyspark

sqlContext = SQLContext(sc) 

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

yılında dataFrame her satırda döngü yukarıdaki deyimi terminalde tüm tabloyu yazdırmak ama.

+0

Doğru bir cevap verdiğime inanıyorum. İyileştirmek için seçim yapabilir veya geri bildirim sağlayabilir misiniz? – aaronsteers

cevap

13

Yapamazsınız. Diğer dağıtılmış veri yapılarıyla aynı olan DataFrames, iterable değildir ve yalnızca özel üst düzey işlev ve/veya SQL yöntemleri kullanılarak erişilebilir.

Elbette collect ait toLocalIterator dönüştürmek ve yerel olarak

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

yineleme ama Spark kullanmanın tüm amacını yener ya.

2

Bir DataFrame nesnesindeki her bir satıra bir şeyler yapmak isterseniz, map'u kullanın. Bu, her satırda daha fazla hesaplama yapmanıza olanak tanır. Bu, tüm veri kümesinde 0'dan len(dataset)-1'a döngü eşdeğeridir.

Bunun bir DataFrame ürünü değil, bir PipelinedRDD döndüreceğini unutmayın.

21

Özel bir işlev tanımlar ve haritayı kullanırsınız.

def customFunction(row): 

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

sample2 = sample.rdd.map(customFunction) 

veya

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

özel bir işlevi

sonra dataframe her satır için uygulanacaktır. Örnek2'nin bir veri çerçevesi değil, bir RDD olacağını unutmayın. Daha karmaşık hesaplamalar yapacaksanız harita gereklidir. Türetilmiş bir sütun eklemeniz gerekiyorsa, withColumn'u kullanarak bir dataframe'i döndürürsünüz. Python liste türetimi kullanma

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

, sadece iki satır kullanarak bir liste halinde değerlerin tüm sütunu toplayabilir: Yukarıdaki örnekte

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

, biz 'veritabanındaki tabloların listemizi dönmek varsayılan ', ancak aynı sql() kullanılan sorguyu değiştirerek aynı uyarlanabilir.

Ya da daha kısaltılmış:

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

Ve üç sütun sizin örneğin

biz sözlüklerde bir listesini oluşturmak ve sonra döngü için içlerinden yineleme yapabilirsiniz.

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

yukarıda

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"])) 
0

name için

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

, age olmalı ve city değişkenler ama sadece sözlüğün anahtarları değildir.

İlgili konular