Pyspark - Как вставить записи в dataframe 1, основываясь на значении столбца в dataframe2 - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно вставить записи в table1 , основываясь на количестве записей в другой таблице, скажем, table2 , используя искру pyspark. sql (). В настоящее время я могу получить одну запись, выполнив объединение, но мне нужно получить как можно больше записей, вставленных в таблицу 1 на основе 2-й таблицы.

Я предоставляю образцы данных здесь:

df1= sqlContext.createDataFrame([("xxx1","81A01","TERR NAME 01"),("xxx1","81A01","TERR NAME 02"), ("xxx1","81A01","TERR NAME 03")], ["zip_code","zone_code","territory_name"])
df2= sqlContext.createDataFrame([("xxx1","81A01","","NY")], ["zip_code","zone_code","territory_name","state"])

df1.show()
+--------+--------------+--------------+
|zip_code|zone_code     |territory_name|
+--------+--------------+--------------+
|    xxx1|         81A01|  TERR NAME 01|
|    xxx1|         81A01|  TERR NAME 02|
|    xxx1|         81A01|  TERR NAME 03|
+---------------------------------------

# Print out information about this data
df2.show()
+--------+--------------+--------------+-----+
|zip_code|zone_code     |territory_name|state|
+--------+--------------+--------------+-----+     
|    xxx1|         81A01|  null        |   NY|
+---------------------------------------------

В Приведенный выше пример, мне нужно присоединиться к df2 с df1, основываясь на zip_code, и получить столько же записей, сколько для территория_имя в df1.

Ожидаемый результат в df2:

+--------+--------------+--------------+-----+
|zip_code|zone_code     |territory_name|state|
+--------+--------------+--------------+-----+     
|    xxx1|         81A01|  TERR NAME 01|   NY|
|    xxx1|         81A01|  TERR NAME 02|   NY|
|    xxx1|         81A01|  TERR NAME 03|   NY|
+---------------------------------------------

Нужна помощь, пожалуйста, в настоящее время я могу получить одну запись, выполнив объединение

Spark.sql query sample for getting one record:
    df1.createOrReplaceTempView('df1')
    df2.createOrReplaceTempView('df2')
    spark.sql("select a.zip_code,a.zone_code,b.territory_name,a.state from df1 a 
    left join df2 b on a.zip_code = b.zip_code where a.territory_name is null").createOrReplaceTempView('df2')

Спасибо

1 Ответ

0 голосов
/ 06 февраля 2020

Хотелось бы предоставить фрагмент кода, поэтому, возможно, он будет полезен для некоторых.

df1= sqlContext.createDataFrame([("xxx1","81A01","TERR NAME 01"),("xxx1","81A01","TERR NAME 02"), ("xxx1","81A01","TERR NAME 03")], ["zip_code","zone_code","territory_name"])
df2= sqlContext.createDataFrame([("xxx1","","","NY"), ("xxx1","","TERR NAME 99","NY")], ["zip_code","zone_code","territory_name","state"])

df1.createOrReplaceTempView('df1')
df2.createOrReplaceTempView('df2')

spark.sql(“select * from df1”)
+--------+---------+--------------+ 
|zip_code|zone_code|territory_name| 
+--------+---------+--------------+ 
| xxx1   | 81A01   | TERR NAME 01 | 
| xxx1   | 81A01   | TERR NAME 02 | 
| xxx1   | 81A01   | TERR NAME 03 | 
+--------+---------+--------------+ 

spark.sql(“select * from df2”)
+--------+---------+--------------+-----+ 
|zip_code|zone_code|territory_name|state| 
+--------+---------+--------------+-----+ 
| xxx1   |         |              | NY  | 
| xxx1   |         | TERR NAME 99 | NY  | 
+--------+---------+--------------+-----+

spark.sql("""select a.zip_code, b.zone_code, b.territory_name, a.state from df2 a 
            left join df1 b 
            on a.zip_code = b.zip_code 
            where a.territory_name = ''
            UNION
            select a.zip_code, b.zone_code, a.territory_name, a.state from df2 a 
            left join df1 b 
            on a.zip_code = b.zip_code 
            where a.territory_name != ''
            """).createOrReplaceTempView('df3')


spark.sql(“select * from df3”)
+--------+---------+--------------+-----+ 
|zip_code|zone_code|territory_name|state| 
+--------+---------+--------------+-----+ 
| xxx1   | 81A01   | TERR NAME 03 | NY  | 
| xxx1   | 81A01   | TERR NAME 99 | NY  |  
| xxx1   | 81A01   | TERR NAME 01 | NY  | 
| xxx1   | 81A01   | TERR NAME 02 | NY  | 
+--------+---------+--------------+-----+

Спасибо тем, кто помог.

...