Объединение наборов данных и переименование одного столбца - PullRequest
0 голосов
/ 17 февраля 2019

Я знаю, как это сделать, но я полагаю (или, по крайней мере, надеюсь), что есть более простой и менее шаблонный способ сделать то же самое.

Сценарий:

Employee
+-------+---+------------+
|   NAME|AGE|COMPANY_CODE|
+-------+---+------------+
|   John| 41|           1|
|   Mary| 34|           1|
|  Chris| 32|           2|
|Phillip| 22|           2|
|   Tony| 44|           1|
+-------+---+------------+

Company
+----+---------+
|CODE|     NAME|
+----+---------+
|   1|Company-1|
|   2|Company-2|
|   3|Company-3|
+----+---------+

Моя цель состоит в том, чтобы объединить обе таблицы с помощью employee.company_code и company_code и отобразить employee.name как NAME , employee.age как AGE и company.name как COMPANY_NAME (это часть трюка)

// company columns
final Column companyCode = companyDataSet.col("CODE");

// employee columns
final Column employeeCompanyCode = employeeDataSet.col("COMPANY_CODE");

Dataset<Row> join = employeeDataSet.join(companyDataSet, employeeCompanyCode.equalTo(companyCode));

join = join.drop(companyCode).drop(employeeCompanyCode);

Печать join dataframe, теперь мы получаем:

+-------+---+---------+
|   NAME|AGE|     NAME|
+-------+---+---------+
|   John| 41|Company-1|
|   Mary| 34|Company-1|
|  Chris| 32|Company-2|
|Phillip| 22|Company-2|
|   Tony| 44|Company-1|
+-------+---+---------+

Я не могу использовать метод withColumnRenamed ( join.withColumnRenamed ("NAME", "COMPANY_NAME" ), поскольку у меня есть два столбца с именем NAME, и оба будут переименованы

единственный способ, который я обнаружил, это определить все столбцы, которые я хочу показать, передать все из них, чтобы выбрать метод набора данных, а затем переименовать столбцы, как я хочу:

final Column companyName = companyDataSet.col("NAME");
final Column employeeName = employeeDataSet.col("NAME");
final Column employeeAge = employeeDataSet.col("AGE");

join = join.select(employeeName, employeeAge, companyName.alias("COMPANY_NAME"));

+-------+---+------------+
|   NAME|AGE|COMPANY_NAME|
+-------+---+------------+
|   John| 41|   Company-1|
|   Mary| 34|   Company-1|
|  Chris| 32|   Company-2|
|Phillip| 22|   Company-2|
|   Tony| 44|   Company-1|
+-------+---+------------+

ВВ этом конкретном случае нет ничего сложного в определении всех столбцов, которые я хочу выбрать, поскольку они представляют собой всего несколько столбцов,но представьте себе в таблицах с пучками столбцов.Определение множества столбцов из-за переименования одного несчастного столбца слишком болезненно.

Есть идеи, как мне этого избежать?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Один из способов - зарегистрировать их как временные таблицы и написать SQL?

employee.createOrReplaceTempView(emp)
company.createOrReplaceTempView(comp)

spark.sql("select t1.Name as Name, t1.Age as Age, t2.Name as Company_Name
        from 
        emp t1 join comp t2
        on
        t1.id = t2.id")
0 голосов
/ 19 февраля 2019

Я нашел одно простое решение, не такое элегантное, как мне кажется, что dataset.withColumnRenamed принимает столбец в качестве первого аргумента, но это лучше, чем включать все столбцы только из-за переименования одного столбца.

Простопереименуйте столбец NAME из companyDataSet перед присоединением к employeeDataSet:

companyDataSet = companyDataSet.withColumnRenamed("NAME", "COMPANY_NAME");
0 голосов
/ 17 февраля 2019

Вы должны быть в состоянии сделать:

join = join.withColumnRenamed(companyDataSet.col("NAME"), "COMPANY_NAME")

Это решит вашу проблему?

...