Объединить два кадра данных в PySpark - PullRequest
0 голосов
/ 09 мая 2018

У меня есть два кадра данных, DF1 и DF2, DF1 - мастер, который хранит любую дополнительную информацию из DF2.

Допустим, DF1 имеет следующий формат,

Item Id | item      | count
---------------------------
1       | item 1    | 2
2       | item 2    | 3
1       | item 3    | 2
3       | item 4    | 5

DF2 содержит 2 элемента, которые уже присутствовали в DF1, и две новые записи. (itemId и item рассматриваются как одна группа, могут рассматриваться как ключ для объединения)

Item Id | item      | count
---------------------------
1       | item 1    | 2
3       | item 4    | 2
4       | item 4    | 4
5       | item 5    | 2

Мне нужно объединить два кадра данных так, чтобы существующее количество элементов увеличивалось, а новые элементы вставлялись.

Результат должен быть таким:

Item Id | item      | count
---------------------------
1       | item 1    | 4
2       | item 2    | 3
1       | item 3    | 2
3       | item 4    | 7
4       | item 4    | 4
5       | item 5    | 2

У меня есть один способ добиться этого, но я не уверен, что это эффективно или правильно

temp1 = df1.join(temp,['item_id','item'],'full_outer') \
    .na.fill(0)

temp1\
    .groupby("item_id", "item")\
    .agg(F.sum(temp1["count"] + temp1["newcount"]))\
    .show()

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Так как схема для двух фреймов данных одинакова, вы можете выполнить union и сделать do 10000 * id и aggregate подсчета.

step1: df3 = df1.union(df2);
step2: df3.groupBy("Item Id", "item").agg(sum("count").as("count"));
0 голосов
/ 09 мая 2018

Есть несколько способов сделать это.

Исходя из того, что вы описываете, самым простым решением было бы использование RDD - SparkContext.union:

rdd1 = sc.parallelize(DF1)
rdd2 = sc.parallelize(DF2)

union_rdd = sc.union([rdd1, rdd2])

альтернативное решение будет использовать DataFrame.union из pyspark.sql

Примечание: я уже предлагал unionAll ранее, но в Spark 2.0 * 1012 он устарел

...