加入后如何重命名重复的列?

Zha*_*Xin 5 apache-spark apache-spark-sql pyspark

我想将join与3个数据框一起使用,但是有些列我们不需要,或者与其他数据框有重复的名称,因此我想删除一些列,如下所示:

result_df = (aa_df.join(bb_df, 'id', 'left')
  .join(cc_df, 'id', 'left')
  .withColumnRenamed(bb_df.status, 'user_status'))
Run Code Online (Sandbox Code Playgroud)

请注意,该status列位于两个数据帧中,即aa_dfbb_df

上面的方法不起作用。我也尝试使用withColumn,但是创建了新列,而旧列仍然存在。

Ram*_*jan 9

如果您尝试重命名数据框的status列,bb_df那么您可以在加入时这样做

result_df = aa_df.join(bb_df.withColumnRenamed('status', 'user_status'),'id', 'left').join(cc_df, 'id', 'left')
Run Code Online (Sandbox Code Playgroud)


Jac*_*ski 6

我想对3个数据框使用join,但是有些列我们不需要,或者与其他数据框有重复的名称

这是使用aliasas运算符为数据集别名的好用例。

alias(别名:字符串):Dataset [T]alias(别名:Symbol):Dataset [T] 返回带有别名集的新数据集。与。

as(别名:字符串):数据集[T]as(别名:符号):数据集[T] 返回具有别名集的新数据集。

(老实说,我现在才看到Symbol基于-的变体。)

注意有两个as运算符,as用于别名和as类型映射。咨询数据集 API。

为数据集添加别名后,可以使用[alias].[columnName]格式引用列。这与加入特别方便星级列提领使用*

val ds1 = spark.range(5)
scala> ds1.as('one).select($"one.*").show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

val ds2 = spark.range(10)
// Using joins with aliased datasets
// where clause is in a longer form to demo how ot reference columns by alias
scala> ds1.as('one).join(ds2.as('two)).where($"one.id" === $"two.id").show
+---+---+
| id| id|
+---+---+
|  0|  0|
|  1|  1|
|  2|  2|
|  3|  3|
|  4|  4|
+---+---+
Run Code Online (Sandbox Code Playgroud)

所以我想删除一些像下面的列

我的一般建议不是drop列,而是select要包含在结果中的列。当您知道自己得到了什么(而不是没有得到的)时,这会使生活更加可预测。有人告诉我,我们的大脑积极地工作,这也可以说明问题select

因此,正如您在上面的示例中所问及我所展示的那样,结果具有两个具有相同名称的列id。问题是如何只有一个。

使用join包含连接列或条件的运算符的变体至少有两个答案(就像您在问题中所显示的那样),但这不会回答您有关“删除不需要的列”的真正问题,对吗?

鉴于我更喜欢select(而不是drop),我将做以下操作以创建一id列:

val q = ds1.as('one)
  .join(ds2.as('two))
  .where($"one.id" === $"two.id")
  .select("one.*") // <-- select columns from "one" dataset
scala> q.show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+
Run Code Online (Sandbox Code Playgroud)

不管您问这个问题的原因是什么(也可以通过上面提出的观点来回答),让我回答withColumnRenamed当两个匹配的列(在之后join)如何使用(燃烧)问题。

假设您以以下查询结束,因此,您有两id列(每个连接端)。

val q = ds1.as('one)
  .join(ds2.as('two))
  .where($"one.id" === $"two.id")
scala> q.show
+---+---+
| id| id|
+---+---+
|  0|  0|
|  1|  1|
|  2|  2|
|  3|  3|
|  4|  4|
+---+---+
Run Code Online (Sandbox Code Playgroud)

withColumnRenamed 在这种情况下将不起作用,因为它不接受别名列名称。

scala> q.withColumnRenamed("one.id", "one_id").show
+---+---+
| id| id|
+---+---+
|  0|  0|
|  1|  1|
|  2|  2|
|  3|  3|
|  4|  4|
+---+---+
Run Code Online (Sandbox Code Playgroud)

您可以select按以下方式感兴趣的列:

scala> q.select("one.id").show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

scala> q.select("two.*").show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+
Run Code Online (Sandbox Code Playgroud)