объединение таблиц с разным количеством столбцов в scala

#scala #apache-spark #apache-spark-sql

#scala #apache-spark #apache-spark-sql

Вопрос:

Я пытаюсь выполнить объединение между двумя таблицами с разным количеством столбцов.

образцы данных

Movieid возможности вероятность
2 0.37986 0.50231
4 0.83521 0.2925
6 0.9925 0.7062
8 0.327 0.764
Movieid Название жанры
1 История игрушек (1995) Приключения, анимация, дети
2 Джуманджи (1995) Дочерние элементы
3 Ожидание выдоха (1995) комедия, драма, романтика
4 Отец невесты, часть II (1995) Юмор
5 Сабрина (1995) Романтика, комедия

корень:

Файл1

    |-- MovieIdId: integer (nullable = false)
   |-- features: Double (nullable = false)
   |-- probability: Double (nullable = false)
 

Файл2

    |--MovieId: integer (nullable = false)
   |--title: String (nullable = false)
   |-- genres: String (nullable = false)
 

код:`

 `val Data = sc.textFile("file:///usr/local/File1").map(_.split(",")).map(p => DataClass(p(0).trim.toInt, p(1).trim, p(2).trim)).toDF()
Data.registerTempTable("Genres")
val Data2 = sc.textFile("file:///usr/local/File2").map(_.split(",")).map(p =>Movie(p(0).trim.toInt, p(1).trim, p(1).trim)).toDF()
Data.registerTempTable("Tags")
val df=sqlContext.sql("SELECT MovieId, title, genres FROM Genres UNION ALL SELECT MovieId, features, probability FROM Tags")
 

Обновить:

Я хочу создать таблицу, содержащую MovieID, функции, вероятность, жанры.

Как объединить два столбца из двух таблиц без дублирования?

Комментарии:

1. вы уверены, что хотите объединить все, а не объединение?

2. извините, я новичок в spark. Я пробую только unionAll.

3. можете ли вы добавить свой входной фрейм данных и желаемый результат?

4. Я обновляю свой вопрос с помощью ввода.

5. я хотел, чтобы вводились ДАННЫЕ exemple и выводились ДАННЫЕ exemple, а не схема.

Ответ №1:

Я думаю, вам нужно полное внешнее объединение, а не объединение:

 val df = Data.join(Data2, Seq("Movieid"), "full")

df.show
// ------- -------- ----------- ---------------------------------- ---------------------------- 
//|Movieid|features|probability|title                             |genres                      |
// ------- -------- ----------- ---------------------------------- ---------------------------- 
//|1      |null    |null       |Toy Story (1995)                  |Adventure,Animation,children|
//|6      |0.9925  |0.7062     |null                              |null                        |
//|3      |null    |null       |Waiting to Exhale (1995)          |comedy,Drama,Romance        |
//|5      |null    |null       |Sabrina (1995)                    |Romance,comedy              |
//|4      |0.83521 |0.2925     |Father of the Bride Part II (1995)|comedy                      |
//|8      |0.327   |0.764      |null                              |null                        |
//|2      |0.37986 |0.50231    |Jumanji (1995)                    |Children                    |
// ------- -------- ----------- ---------------------------------- ---------------------------- 
 

Или с использованием SQL:

 val df = spark.sql("""
  select *
  from Genres g
  full outer join Tags t
  on g.Movieid = t.Movieid
""")