Как вставить Spark DataFrame во внутреннюю таблицу Hive без дублирования? - PullRequest
0 голосов
/ 07 октября 2018

Итак, команда для добавления фрейма данных spark непосредственно в таблицу кустов:

df.write().mode("append").saveAsTable("tableName")

Но обеспечивает ли режим добавления, что он позволит избежать дублирования строк?Например:

  • , если строка A находится в таблице кустов, а также в кадре данных искры
  • добавление кадра данных искры в таблицу кустов приведет к двум строкам A?

Есть ли способ, чтобы избежать дублирования при добавлении?

Редактировать: Есть два пути:

  • один упомянутый shu , загрузить таблицу кустов в качестве искрового фрейма данных, объединить двакадры данных, отбрасывать дубликаты и записывать обратно в таблицу кустов с режимом «перезапись».
  • секунда, загрузка таблицы кустов в временную таблицу, добавление кадра данных во временную таблицу, получение отдельных строк и перезапись временной таблицы обратно в таблицу кустов.

То, что я ищу, этоЕсть ли способ сделать все это напрямую, без промежуточного шага записи данных во временную таблицу или фрейм данных?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

При добавлении фрейма данных искры к таблице куста получится две строки A .

Чтобы убедиться, что дублирование не происходит при добавлении, тогда

  1. Вам необходимо загрузить всю таблицу кустов в другой фрейм данных (df1) , прежде чем добавлять данные в таблицу .

  2. Затем объединить два фрейма данных (df, df1) и применить .dropDuplicates() (или) window functions, чтобы получить необходимую запись из дублированных записей.

    Пример:

    union_df=df.union(df1)

    union_df.dropDuplicates() (или) use window function

  3. Затем запишите данные в новую таблицу (union_df.write().mode("append").saveAsTable("newtableName")) и, наконец, выберитеданные из новой таблицы перезаписывают существующую таблицу кустов.

    Пример:

    spark.sql("insert overwrite table <database>.<existing_table> select * from <database>.<new_table>"))

  4. Наконец, удалите новую таблицу, которая spark.sql("drop table <database>.<new_table>")

Используя этот способ, вы получите данные, которые не дублируются в таблице кустов.

0 голосов
/ 07 октября 2018

Ничто из того, что вы просите, невозможно с помощью df.write.Сожалею.Т.е. потенциально вы получите 2 строки.

...