2017-04-20 44 views
-1

我是PySpark的新手。 我有2個表,1:索引表和2:圖表中顯示的值表。 Table Images根據PySpark和HBase中另一個表的索引有效掃描表格


我想知道這樣的一個有效的方法如下:

  • 通過表1上運行掃描,並獲得該指數
  • 運行通過表2的掃描,並獲得對應於給定索引

然後值I有多個這樣的(Key-Index)表和(Index-Value)表。 請讓我知道執行這些掃描的最高效和PySpark方式。 我想知道這樣的一種方式:


rdd1 = scan 'table1' {FILTER => key ='some value'} # Will get Index values rdd2 = scan 'table2', {STARTROW => The Results of table 1}

所以,如果RDD1集返回10行,那麼,在這10行的索引字段中的值將用來掃描表2,並得到來自table2的值。 這使我依次在table2上運行10次掃描,並最終耗費大量時間。 我想知道一種方法來平行掃描表2, rdd1.map(lamba x: scan table2 給我錯誤,因爲我最終掃描內部掃描,我不能這樣做。
如果您認爲效率更高,請提供其他方法。 感謝

做你想要使用 Dataframes而不是RDD

什麼

+1

請刪除圖像並將其作爲示例數據發佈。同時顯示你已經嘗試了什麼,以及你得到的錯誤。 「我們不允許這樣做:rdd.map(anotherRDD)」沒有意義?效率是主觀的。 – Pushkr

+0

@Pushkr我試圖詳細闡述一下,但我無法在這裏分享數據。請讓我知道如果你仍然覺得困惑,我會盡可能清楚地解釋整個情況。 –

回答

0

高效和簡單的方式讓說你有像這樣的數據 -

table1 = [(1,'A'),(2,'B'),(3,'C'),(4,'B')] 
table2 = [('A',10),('B',20),('D',30),('E',40)] 

# create the dataframes based on the data 
df1 = spark.createDataFrame(table1,schema=['k1','v1']) 
df2 = spark.createDataFrame(table2,schema=['k2','v2']) 

df1.show() 
+---+---+ 
| k1| v1| 
+---+---+ 
| 1| A| 
| 2| B| 
| 3| C| 
| 4| B| 
+---+---+ 

df2.show() 
+---+---+ 
| k2| v2| 
+---+---+ 
| A| 10| 
| B| 20| 
| D| 30| 
| E| 40| 
+---+---+ 

# do a simple inner join and only select df2 columns 
df2\ 
.join(df1, df1.v1==df2.k2)\ 
.select(df2.columns)\ 
.dropDuplicates() 
.show() 

+---+---+ 
| k2| v2| 
+---+---+ 
| B| 20| 
| A| 10| 
+---+---+ 

只是用RDDS -

rdd1 = sc.parallelize(table1) 
rdd2 = sc.parallelize(table2) 

rdd2\ 
.join(rdd1.map(lambda x : (x[1],x[0])))\ 
.mapValues(lambda x: x[0])\ 
.distinct()\ 
.collect() 
+0

嘿@pushkr,我很感謝你的解決方案。 我有一個要求以rdds的形式保存數據。另外,我一定會考慮內部連接。 感謝您的建議。如果您仍然對此感興趣,我可以分享我擁有的一些實際表格,並且可能會提出解決方案。 –

+0

使用rdds進行更新。 – Pushkr

+0

Thanks @Pushkr所以如果你已經有rdd2,這個解決方案就可以工作。 如果我沒有將table2作爲rdd2,但必須使用掃描命令(從rdd1的每一行使用STARTROW和ENDROW),該怎麼辦? 如果我還沒有掃描並將table2存儲爲rdd,我無法使用連接,對不對? 我只想要table2中那些k2值在v1中的行。 –