Scala Dataframe 仅连接并获取正确的表列

     2023-04-17     182

关键词:

【中文标题】Scala Dataframe 仅连接并获取正确的表列【英文标题】:Scala Dataframe join and get right table columns only 【发布时间】:2021-06-22 23:07:39 【问题描述】:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

val df1 = Seq(
  (1,"A") 
  ).toDF("id","value")
df1.show()

val df2 = Seq(
  (1,"C") 
  ).toDF("id","value")
df2.show()

val joinKey = "id"
    
df1.join(df2.as("dfy"),joinKey.split(",").toSeq).show()

   

 Output:
    +---+-----+
    | id|value|
    +---+-----+
    |  1|    A|
    +---+-----+
    
    +---+-----+
    | id|value|
    +---+-----+
    |  1|    C|
    +---+-----+
    
    +---+-----+-----+
    | id|value|value|
    +---+-----+-----+
    |  1|    A|    C|
    +---+-----+-----+

我只想从右表中获取列,包括连接键“id”。但是由于 scala 跳过了重复的列,所以如果我按照下面的操作,这在右表中不可用。

df1.as("dfx").join(df2.as("dfy"),joinKey.split(",").toSeq).select($"dfy.*").show()

+-----+
|value|
+-----+
|    C|
+-----+

这可行,但我不想从右表中获取所有行,因为可能有很多。

 df1.as("dfx").join(df2.as("dfy"),joinKey.split(",").toSeq,"right").select($"dfy.*").show()
+---+-----+
| id|value|
+---+-----+
|  1|    C|
+---+-----+

最好的方法是什么? 谢谢。

【问题讨论】:

【参考方案1】:

由于您真正想要的是内部联接,因此您应该翻转查询并使用 left_semi 联接。

df2.join(df1, joinKey.split(","), "leftsemi").show()

根据您所说的 df2 很大,这甚至应该为您带来性能优势。

【讨论】:

为什么不保留订单并做一个'rightsemi'? Spark 没有 right_semi join 太奇怪了。

在 Spark 中使用 Dataframe 获取平均值

】在Spark中使用Dataframe获取平均值【英文标题】:FetchAvgusingDataframeinSpark【发布时间】:2019-11-2514:30:49【问题描述】:我想在Spark中使用scala代码查找“rate”列的平均值。为此,我创建了Dataframe并查看,然后使用SparkSQL进行查询。... 查看详情

如何在 Scala 中将 DataFrame 模式写入文件

】如何在Scala中将DataFrame模式写入文件【英文标题】:HowtowriteaDataFrameschematofileinScala【发布时间】:2016-07-0105:35:16【问题描述】:我有一个从一个巨大的json文件加载并从中获取架构的DataFrame。架构基本上是1000列左右。我希望将pr... 查看详情

Scala Dataframe 获取特定行的最大值

】ScalaDataframe获取特定行的最大值【英文标题】:ScalaDataframegetmaxvalueofspecificrow【发布时间】:2019-08-2909:49:02【问题描述】:给定一个带有索引列(“Z”)的数据框:valtmp=Seq(("D",0.1,0.3,0.4),("E",0.3,0.1,0.4),("F",0.2,0.2,0.5)).toDF("Z","a","b"... 查看详情

从 Dataframe 获取单个单元格值的更快方法(仅使用转换)

】从Dataframe获取单个单元格值的更快方法(仅使用转换)【英文标题】:FasterwaytogetsinglecellvaluefromDataframe(usingjusttransformation)【发布时间】:2021-08-1709:51:59【问题描述】:我有以下代码,我想从dfBackendInfo获取DataframedfDateFiltered,... 查看详情

在 Scala 中用不同的 DataType 展平一个 DataFrame

】在Scala中用不同的DataType展平一个DataFrame【英文标题】:FlattenaDataFrameinScalawithdifferentDataTypesinside【发布时间】:2018-01-0119:36:48【问题描述】:您可能知道,DataFrame可以包含复杂类型的字段,例如结构(StructType)或数组(ArrayType)。... 查看详情

将DataFrame转换为scala中的字符串

】将DataFrame转换为scala中的字符串【英文标题】:convertaDataFrameintoastringinscala【发布时间】:2017-10-1115:34:19【问题描述】:我正在尝试在sbt中下载Hivejar,但出现以下错误。有没有人遇到过这个?请告诉我创建GenericUDF类所需的正确... 查看详情

Spark:Dataframe 管道分隔不返回正确的值

】Spark:Dataframe管道分隔不返回正确的值【英文标题】:Spark:Dataframepipedelimiteddoesn\'treturncorrectvalues【发布时间】:2019-09-1006:22:53【问题描述】:我的数据框如下:scala>products_df.show(5)+--------------------+|value|+--------------------+|1009|45... 查看详情

Spark Dataframe - 计算列之间的对(Scala)

】SparkDataframe-计算列之间的对(Scala)【英文标题】:SparkDataframe-Computationofpairsbetweencolumns(Scala)【发布时间】:2018-11-0615:36:54【问题描述】:我有以下情况:我有一个带有“id”和“array”作为架构的数据框。现在我想为每个数组... 查看详情

如何克隆案例类实例并仅更改 Scala 中的一个字段?

】如何克隆案例类实例并仅更改Scala中的一个字段?【英文标题】:HowtocloneacaseclassinstanceandchangejustonefieldinScala?【发布时间】:2011-11-0703:25:27【问题描述】:假设我有一个代表人物角色的案例类,即不同社交网络上的人。该类的... 查看详情

在 Python 中的 For 循环内连接并附加到 DataFrame

】在Python中的For循环内连接并附加到DataFrame【英文标题】:ConcatenatingandappendingtoaDataFrameinsidetheForLoopinPython【发布时间】:2021-10-3106:11:26【问题描述】:我有以下问题。有相当大的数据集包含特征和ID。由于任务定义,我正在尝试... 查看详情

Scala Spark,比较两个 DataFrame 并选择另一列的值

】ScalaSpark,比较两个DataFrame并选择另一列的值【英文标题】:ScalaSpark,comparetwoDataFramesandselectthevalueofanothercolumn【发布时间】:2021-02-2515:01:17【问题描述】:我有两个数据框。我真正想做的是:如果列Name是“P”,那么我必须选择... 查看详情

使用dataframe类型在scala中定义函数(代码片段)

...数的函数并返回另一个数据帧我做:valget_nb_previous_offre:((DataFrame)=>(DataFrame))=(arg1:DataFrame)=>//createnew_dfusingarg1(=DataFrameIpassinparameter)new_df我收到错误:<console>:32:error:notfound:typeDataFramevalget_nb_previous_offre:((DataFrame)=>(DataFrame))... 查看详情

Scala:如何在数据框中获取一系列行

...框中获取一系列行【英文标题】:Scala:Howtogetarangeofrowsinadataframe【发布时间】:2016-09-0203:49:42【问题描述】:我有一个通过运行Parquet文件的sqlContext.read创建的DataFrame。DataFrame包含300M行。我需要将这些行用作另一个函数的输入,... 查看详情

在scala中将Spark Dataframe转换为RDD

】在scala中将SparkDataframe转换为RDD【英文标题】:ConvertingSparkDataframetoRDDinscala【发布时间】:2016-05-0907:49:45【问题描述】:我正在寻找更好的方法将Dataframe转换为RDD。现在我正在将数据帧转换为集合并循环集合以准备RDD。但我们... 查看详情

如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?

】如何在SparkScala数据框中拆分逗号分隔的字符串并获取n个值?【英文标题】:HowtosplitcommaseparatedstringandgetnvaluesinSparkScaladataframe?【发布时间】:2017-07-1317:06:13【问题描述】:如何从SparkScala中的arraytype列中仅获取2个数据?我得到... 查看详情

获取一行数据帧的字段值 - Spark Scala

...的字段值-SparkScala【英文标题】:GettingvaluesofFieldsofaRowofDataFrame-SparkScala【发布时间】:2017-06-2022:44:47【问题描述】:我有一个包含多条记录的DataFrame,我想迭代此DataFrame的每一行以验证其每一列的数据,执行类似于以下代码的操... 查看详情

Pandas DataFrame:如何获取列平均值但仅考虑索引低于我想要获取平均值的行

】PandasDataFrame:如何获取列平均值但仅考虑索引低于我想要获取平均值的行【英文标题】:PandasDataFrame:howtogetcolumnmeanvaluebuttakingintoaccountonlytherowsthathavelowerindexthantheoneIwanttogetthemean【发布时间】:2019-02-0120:39:52【问题描述】:我... 查看详情

仅从 Spark Scala DataFrame 写入标头 CSV 记录

】仅从SparkScalaDataFrame写入标头CSV记录【英文标题】:WriteHeaderonlyCSVrecordfromSparkScalaDataFrame【发布时间】:2018-06-0714:02:33【问题描述】:我的要求是使用SparkScalaDataFrame仅写入HeaderCSV记录。谁能帮我解决这个问题。valOHead1="/xxxxx/xxxx/... 查看详情