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_df和bb_df。
上面的方法不起作用。我也尝试使用withColumn,但是创建了新列,而旧列仍然存在。
如果您尝试重命名数据框的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)
我想对3个数据框使用join,但是有些列我们不需要,或者与其他数据框有重复的名称
这是使用alias或as运算符为数据集别名的好用例。
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)
| 归档时间: |
|
| 查看次数: |
5447 次 |
| 最近记录: |