Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何减少spark中的多个联接_Scala_Dataframe_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Scala 如何减少spark中的多个联接

Scala 如何减少spark中的多个联接,scala,dataframe,apache-spark,pyspark,apache-spark-sql,Scala,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我正在使用Spark 2.4.1计算数据帧上的一些比率 其中,我需要通过连接到元数据帧(即,resDs)来查找给定数据帧(df_data)中的不同比率因子、不同列 我通过使用具有不同连接条件的三个不同连接来获得这些比率因子(即ratio\u 1\u factor,ratio\u 2\u factor,ratio\u 3\u factor),即joinedDs,joinedDs3 有没有其他方法可以减少连接的数量??使其工作最佳 您可以在下面的公共URL中找到完整的示例数据 如何在when子句中

我正在使用Spark 2.4.1计算数据帧上的一些比率

其中,我需要通过连接到元数据帧(即,
resDs
)来查找给定数据帧(
df_data
)中的不同比率因子、不同列

我通过使用具有不同连接条件的三个不同连接来获得这些比率因子(即
ratio\u 1\u factor
ratio\u 2\u factor
ratio\u 3\u factor
),即
joinedDs
joinedDs3

有没有其他方法可以减少连接的数量??使其工作最佳

您可以在下面的公共URL中找到完整的示例数据

如何在when子句中处理多个步骤而不是单步执行:

.withColumn("step_1_ratio_1", (col("ratio_1").minus(lit(0.00000123))).cast(DataTypes.DoubleType)) // step-2
      .withColumn("step_2_ratio_1", (col("step_1_ratio_1").multiply(lit(0.02))).cast(DataTypes.DoubleType)) //step-3
      .withColumn("step_3_ratio_1", (col("step_2_ratio_1").divide(col("step_1_ratio_1"))).cast(DataTypes.DoubleType)) //step-4
      .withColumn("ratio_1_factor", (col("ratio_1_factor")).cast(DataTypes.DoubleType)) //step-5
i、 e.“比率系数”是根据数据框、df_数据中的各种其他列计算的

这些步骤-2、3、4也用于其他比率因子的计算。i、 e.比率系数,比率系数
如何处理这一问题?

当在聚合中起作用时,您可以加入一次并计算
比率系数
比率系数
比率系数

val joinedDs=df_data.as(“aa”)
.加入(
广播(简称"bb"),,
col(“aa.g_日期”)。介于(col(“bb.start_日期”)、col(“bb.end_日期”)之间
)
.groupBy(“项目id”、“g\U日期”、“比率1”、“比率2”、“比率3”)
阿格先生(
最大值(何时)(
列(“aa.ratio_1”)。在(列(“bb.A”)、列(“bb.A_lead”)之间,
col(“比率_1”)。乘法(lit(0.1))
)
).cast(双重类型).as(“比率系数”),
最大值(何时)(
列(“aa.ratio_2”)。在(列(“bb.A”)、列(“bb.A_铅”)之间,
col(“比率_2”)。乘法(lit(0.2))
)
).cast(双重类型).as(“比率系数”),
最大值(何时)(
列(“aa.ratio_3”)。在(列(“bb.A”)、列(“bb.A_lead”)之间,
col(“比率_3”)。乘法(lit(0.3))
)
).cast(双重类型).as(“比率系数”)
)
联合显示(假)
//+-------+----------+---------+-----------+-----------+---------------------+--------------+--------------+
//|项目| id | g |日期|比率|比率|比率|比率|比率|比率|比率|比率|比率|比率|比率||
//+-------+----------+---------+-----------+-----------+---------------------+--------------+--------------+
//|50312  |2016-01-04|0.0456646|0.046899415|0.046000415|0.0045664600000000005|0.009379883   |0.0138001245  |
//+-------+----------+---------+-----------+-----------+---------------------+--------------+--------------+

当在聚合中起作用时,您可以加入一次并使用
max
计算
比率1\u因子
比率2\u因子
列:

val joinedDs=df_data.as(“aa”)
.加入(
广播(简称"bb"),,
col(“aa.g_日期”)。介于(col(“bb.start_日期”)、col(“bb.end_日期”)之间
)
.groupBy(“项目id”、“g\U日期”、“比率1”、“比率2”、“比率3”)
阿格先生(
最大值(何时)(
列(“aa.ratio_1”)。在(列(“bb.A”)、列(“bb.A_lead”)之间,
col(“比率_1”)。乘法(lit(0.1))
)
).cast(双重类型).as(“比率系数”),
最大值(何时)(
列(“aa.ratio_2”)。在(列(“bb.A”)、列(“bb.A_铅”)之间,
col(“比率_2”)。乘法(lit(0.2))
)
).cast(双重类型).as(“比率系数”),
最大值(何时)(
列(“aa.ratio_3”)。在(列(“bb.A”)、列(“bb.A_lead”)之间,
col(“比率_3”)。乘法(lit(0.3))
)
).cast(双重类型).as(“比率系数”)
)
联合显示(假)
//+-------+----------+---------+-----------+-----------+---------------------+--------------+--------------+
//|项目| id | g |日期|比率|比率|比率|比率|比率|比率|比率|比率|比率|比率|比率||
//+-------+----------+---------+-----------+-----------+---------------------+--------------+--------------+
//|50312  |2016-01-04|0.0456646|0.046899415|0.046000415|0.0045664600000000005|0.009379883   |0.0138001245  |
//+-------+----------+---------+-----------+-----------+---------------------+--------------+--------------+

非常感谢,我还有一个疑问,在“何时”条款中,如果我需要处理多个步骤而不是一个,即col(“ratio_x”)。multiply(lit(0.x)),如何处理它。这些多步骤(即新列值)也用于其他比率列,即比率系数、比率系数和比率系数。我已经更新了新的查询,请您提供建议。@b工程师如果您这样简单地编写,会有什么问题:
。withColumn(“ratio\u 1\u factor”),(col(“ratio\u 1”)-lit(0.00000123))*lit(0.02)/(col(“ratio\u 1”)-lit(0.00000123))
?在使用
时,像这样使用它是没有问题的。您只需要简化表达式,when表达式背后的逻辑是相同的。编写这样的查询的步骤/方法是什么,应该如何培养像您这样的技能?你是怎么写的。。。我仍然在努力正确使用agg函数。。。我缺少一些基本的东西。。。plz帮助。。。先生,我有一个这样的用例,你能建议如何处理它吗?非常感谢,我还有一个疑问,在“何时”子句中,如果我需要处理多个步骤而不是一个,即col(“ratio_x”)。multiply(lit(0.x)),如何处理它。这些多步骤(即新列值)也用于其他比率列,即比率系数、比率系数和比率系数。我已经更新了新的查询,请您提供建议。@b工程师如果您这样简单地编写,会有什么问题:
。withColumn(“ratio\u 1\u factor”),(col(“ratio\u 1”)-lit(0.00000123))*lit(0.02)/(col(“ratio\u 1”)-lit(0.00000123))
?在使用
时,像这样使用它是没有问题的。您只需要简化表达式,when表达式背后的逻辑是相同的。编写这样的查询的步骤/方法是什么,应该如何培养像您这样的技能?你是怎么写的。。。s