2016-10-14 2 views
1

두 개의 DataFrames를 키로 결합하는 방법을 찾고 있습니다.RDD에서 접합 된 DataFrames까지 PySpark

감안할 때 :

x = sc.parallelize([('_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', 'FR', '75001'), 
       ('_guid_XblBPCaB8qx9SK3D4HuAZwO-1cuBPc1GgfgNUC2PYm4=', 'TN', '8160'), 
       ] 
      ) 

y = sc.parallelize([('_guid_oX6Lu2xxHtA_T93sK6igyW5RaHH1tAsWcF0RpNx_kUQ=', 'JmJCFu3N'), 
       ('_guid_hG88Yt5EUsqT8a06Cy380ga3XHPwaFylNyuvvqDslCw=', 'KNPQLQth'), 
       ('_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', 'KlGZj08d'), 
       ] 
      ) 

내 코드 :

df_x = x.toDF(['id', 'countrycode', 'postalcode']) 
df_y = y.toDF(['id_gigya', 'krux']) 

df = df_x.join(df_y, df_x.id == df_y.id_gigya, 'fullouter') 

주는 : 나는 rdds에서 Dataframes을 작성하여 시작

[Row(id=u'_guid_XblBPCaB8qx9SK3D4HuAZwO-1cuBPc1GgfgNUC2PYm4=', countrycode=u'TN', postalcode=u'8160', id_gigya=None, krux=None), 
Row(id=None, countrycode=None, postalcode=None, id_gigya=u'_guid_oX6Lu2xxHtA_T93sK6igyW5RaHH1tAsWcF0RpNx_kUQ=', krux=u'JmJCFu3N'), 
Row(id=None, countrycode=None, postalcode=None, id_gigya=u'_guid_hG88Yt5EUsqT8a06Cy380ga3XHPwaFylNyuvvqDslCw=', krux=u'KNPQLQth'), 
Row(id=u'_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', countrycode=u'FR', postalcode=u'75001', id_gigya=u'_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', krux=u'KlGZj08d')] 

그것은 완벽하지만은 킵을 원한다 고유 id 인 'id_gigya'또는 'id'입니다. 동일한 ID이므로!

[Row(id=u'_guid_XblBPCaB8qx9SK3D4HuAZwO-1cuBPc1GgfgNUC2PYm4=', countrycode=u'TN', postalcode=u'8160', krux=None), 
Row(id=None, countrycode=None, postalcode=None, krux=u'JmJCFu3N'), 
Row(id=None, countrycode=None, postalcode=None, krux=u'KNPQLQth'), 
Row(id=u'_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', countrycode=u'FR', postalcode=u'75001', krux=u'KlGZj08d')] 

[Row(countrycode=u'TN', postalcode=u'8160', id_gigya=None, krux=None), 
Row(countrycode=None, postalcode=None, id_gigya=u'_guid_oX6Lu2xxHtA_T93sK6igyW5RaHH1tAsWcF0RpNx_kUQ=', krux=u'JmJCFu3N'), 
Row(countrycode=None, postalcode=None, id_gigya=u'_guid_hG88Yt5EUsqT8a06Cy380ga3XHPwaFylNyuvvqDslCw=', krux=u'KNPQLQth'), 
Row(countrycode=u'FR', postalcode=u'75001', id_gigya=u'_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', krux=u'KlGZj08d')] 

내 OBJECTIF은, 어쨌든 가지고 행에 의해 ID입니다 .. 아이디어이있어 I

df_x.join(df_y, df_x.id == df_y.id_gigya, 'fullouter').drop(df_y.id_gigya).collect() 

Or 

df_x.join(df_y, df_x.id == df_y.id_gigya, 'fullouter').drop(df_x.id).collect() 

:와

? 고마워 !

+0

제공된 답변으로 문제가 해결되면 문제를 해결하기 위해 동의하십시오. 그렇지 않으면 질문에 답하는 이유에 대한 답변 아래에 의견을 말하십시오. – eliasah

답변

1

당신이 당신의 가입 데이터 세트가 있으면, 당신은 다음 RDD로 변환, 출력 특정 컬럼에 다른 select를 실행할 때만 null 이외의 ID를 얻기 위해 매핑 할 수 있습니다

df.select('id','id_gigya','countrycode','postalcode')\ 
    .rdd\ 
    .map(lambda x: Row(id=(x.id if x.id_gigya == None else x.id_gigya), postalcode=x.postalcode, countrycode=x.countrycode))\ 
    .collect() 

출력 :

[ 
    Row(countrycode=u'TN', id=u'_guid_XblBPCaB8qx9SK3D4HuAZwO-1cuBPc1GgfgNUC2PYm4=', postalcode=u'8160'), 
    Row(countrycode=None, id=u'_guid_hG88Yt5EUsqT8a06Cy380ga3XHPwaFylNyuvvqDslCw=', postalcode=None), 
    Row(countrycode=u'FR', id=u'_guid_YWKnKkcrg_Ej0icb07bhd-mXPjw-FcPi764RRhVrOxE=', postalcode=u'75001'), 
    Row(countrycode=None, id=u'_guid_oX6Lu2xxHtA_T93sK6igyW5RaHH1tAsWcF0RpNx_kUQ=', postalcode=None) 
]