加入数据集并重命名一个列



我知道如何完成它,但是我想(或至少我希望)有一种更轻松,更少的样板,可以做同样的方法。

方案:

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|
+----+---------+

我的目标是雇员加入这两个表 age and company.name as 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|
+-------+---+---------+

我无法使用columnrensionaldathode( join.withcolumnrenrened(" name"," company_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|
+-------+---+------------+

在这种特定情况下,定义我要选择的所有列并不重要,因为它们只是几列,但可以在带有一堆列的桌子中想象。由于一个可悲的列重命名而定义很多列太痛苦了。

知道我如何避免这种情况?

您应该能够做:

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

这会解决您的问题吗?

一种方法是将它们注册为临时表并编写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")

我找到了一个简单的解决方案,不像我认为的数据集那样优雅。与columnrenrenrenrenrenrensunsion一起接受第一个参数的列,但它比包括所有列仅包括一个列重命名的列要好。

加入opplyeedataset之前,只需从CompanyDataset重命名列名:

companyDataSet = companyDataSet.withColumnRenamed("NAME", "COMPANY_NAME");

相关内容

  • 没有找到相关文章

最新更新