spark 中 dataframe 的 where() 方法中 IN 条件后的意外列值
Unexpected column values after the IN condition in where() method of dataframe in spark
任务:我要child_id
列的值[Which is generated using withColumn() method and monoliticallyIncreasingId() method]
对应family_id
和 id
列。
让我解释一下完成任务的步骤:
第 1 步: 1. 向数据框添加 2 列。 1 个具有唯一 ID 并命名为 child_id,另一个具有值 0 并命名为 parent_id.
第 2 步: 需要数据帧中的所有 family_ids。
第三步:想要child_id的dataframe和id,其中id==family_id。
[问题就在这里]
def processFoHierarchical(param_df: DataFrame) {
var dff = param_df.withColumn("child_id", monotonicallyIncreasingId() + 1)
println("Something is not gud...")
dff = dff.withColumn("parent_id", lit(0.toLong))
dff.select("id","family_id","child_id").show() // Original dataframe.
var family_ids = ""
param_df.select("family_id").distinct().coalesce(1).collect().map(x => family_ids = family_ids + "'" + x.getAs[String]("family_id") + "',")
println(family_ids)
var x: DataFrame = null
if (family_ids.length() > 0) {
family_ids = family_ids.substring(0, family_ids.length() - 1)
val y = dff.where(" id IN (" + family_ids + ")").select("id","family_id","child_id")
y.show() // here i am getting unexpected values.
}
这是我的代码的输出。我正在尝试根据数据帧获取 child_id 值。但我不明白。
注意: 使用 Spark
和 Scala
.
+--------------------+--------------------+----------+
| id| family_id| child_id|
+--------------------+--------------------+----------+
|fe60c680-eb59-11e...|fe60c680-eb59-11e...| 4|
|8d9680a0-ec14-11e...|8d9680a0-ec14-11e...| 9|
|ff81457a-e9cf-11e...|ff81457a-e9cf-11e...| 5|
|4261cca0-f0e9-11e...|4261cca0-f0e9-11e...| 10|
|98c7dc00-f0e5-11e...|98c7dc00-f0e5-11e...| 8|
|dca16200-e462-11e...|dca16200-e462-11e...|8589934595|
|78be8950-ecca-11e...|ff81457a-e9cf-11e...| 1|
|4cc19690-e819-11e...|ff81457a-e9cf-11e...| 3|
|dca16200-e462-11e...|ff81457a-e9cf-11e...|8589934596|
|72dd0250-eff4-11e...|78be8950-ecca-11e...| 2|
|84ed0df0-e81a-11e...|78be8950-ecca-11e...| 6|
|78be8951-ecca-11e...|78be8950-ecca-11e...| 7|
|d1515310-e9ad-11e...|78be8951-ecca-11e...|8589934593|
|d1515310-e9ad-11e...|72dd0250-eff4-11e...|8589934594|
+--------------------+--------------------+----------+
'72dd0250-eff4-11e5-9ce9-5e5517507c66','dca16200-e462-11e5-90ec-c1cf090b354c','78be8951-ecca-11e5-a5f5-c1cf090b354c','4261cca0-f0e9-11e5-bbba-c1cf090b354c','98c7dc00-f0e5-11e5-bc76-c1cf090b354c','fe60c680-eb59-11e5-9582-c1cf090b354c','ff81457a-e9cf-11e5-9ce9-5e5517507c66','8d9680a0-ec14-11e5-a94f-c1cf090b354c','78be8950-ecca-11e5-a5f5-c1cf090b354c',
+--------------------+--------------------+-----------+
| id| family_id| child_id|
+--------------------+--------------------+-----------+
|fe60c680-eb59-11e...|fe60c680-eb59-11e...| 1|
|ff81457a-e9cf-11e...|ff81457a-e9cf-11e...| 2|
|98c7dc00-f0e5-11e...|98c7dc00-f0e5-11e...| 3|
|8d9680a0-ec14-11e...|8d9680a0-ec14-11e...| 4|
|4261cca0-f0e9-11e...|4261cca0-f0e9-11e...| 5|
|dca16200-e462-11e...|dca16200-e462-11e...| 6|
|78be8950-ecca-11e...|ff81457a-e9cf-11e...| 8589934593|
|dca16200-e462-11e...|ff81457a-e9cf-11e...| 8589934594|
|72dd0250-eff4-11e...|78be8950-ecca-11e...|17179869185|
|78be8951-ecca-11e...|78be8950-ecca-11e...|17179869186|
+--------------------+--------------------+-----------+
我知道它不会产生连续的值,这些值取决于分区。意外值意味着(参见第二个数据帧)那些 child_ids 属于前一个数据帧,其中 family_id = id 并匹配我正在使用 IN 的多个 ID。这里的意外值意味着 child_id 列没有来自上述数据框的值,而是使用 monoliticallyIncresingIds().
创建新的 child_id 列
看到第二个数据帧中的最后 2 个值不属于上述数据帧。那么它从哪里来。我不会在数据框上再次应用 monoliticallyIncresingIds()
。那么,为什么它看起来像具有 monoliticallyIncresingIds()
值的列 (child_id) 再次应用。
但是,问题不在于 spark DataFrame 。当我们将 monoliticallyIncresingId() 与 DataFrame 一起使用时,它会在每次 DataFrame.show() 上创建新的 ID。
如果我们需要生成一次 id 并且需要在代码中的其他地方引用相同的 id 那么我们可能需要 DataFrame.cache().
在您的情况下,您需要在 Step1 之后缓存 DataFrame,这样它就不会每次都创建重复的 child_id 显示().
任务:我要child_id
列的值[Which is generated using withColumn() method and monoliticallyIncreasingId() method]
对应family_id
和 id
列。
让我解释一下完成任务的步骤:
第 1 步: 1. 向数据框添加 2 列。 1 个具有唯一 ID 并命名为 child_id,另一个具有值 0 并命名为 parent_id.
第 2 步: 需要数据帧中的所有 family_ids。
第三步:想要child_id的dataframe和id,其中id==family_id。 [问题就在这里]
def processFoHierarchical(param_df: DataFrame) {
var dff = param_df.withColumn("child_id", monotonicallyIncreasingId() + 1)
println("Something is not gud...")
dff = dff.withColumn("parent_id", lit(0.toLong))
dff.select("id","family_id","child_id").show() // Original dataframe.
var family_ids = ""
param_df.select("family_id").distinct().coalesce(1).collect().map(x => family_ids = family_ids + "'" + x.getAs[String]("family_id") + "',")
println(family_ids)
var x: DataFrame = null
if (family_ids.length() > 0) {
family_ids = family_ids.substring(0, family_ids.length() - 1)
val y = dff.where(" id IN (" + family_ids + ")").select("id","family_id","child_id")
y.show() // here i am getting unexpected values.
}
这是我的代码的输出。我正在尝试根据数据帧获取 child_id 值。但我不明白。
注意: 使用 Spark
和 Scala
.
+--------------------+--------------------+----------+
| id| family_id| child_id|
+--------------------+--------------------+----------+
|fe60c680-eb59-11e...|fe60c680-eb59-11e...| 4|
|8d9680a0-ec14-11e...|8d9680a0-ec14-11e...| 9|
|ff81457a-e9cf-11e...|ff81457a-e9cf-11e...| 5|
|4261cca0-f0e9-11e...|4261cca0-f0e9-11e...| 10|
|98c7dc00-f0e5-11e...|98c7dc00-f0e5-11e...| 8|
|dca16200-e462-11e...|dca16200-e462-11e...|8589934595|
|78be8950-ecca-11e...|ff81457a-e9cf-11e...| 1|
|4cc19690-e819-11e...|ff81457a-e9cf-11e...| 3|
|dca16200-e462-11e...|ff81457a-e9cf-11e...|8589934596|
|72dd0250-eff4-11e...|78be8950-ecca-11e...| 2|
|84ed0df0-e81a-11e...|78be8950-ecca-11e...| 6|
|78be8951-ecca-11e...|78be8950-ecca-11e...| 7|
|d1515310-e9ad-11e...|78be8951-ecca-11e...|8589934593|
|d1515310-e9ad-11e...|72dd0250-eff4-11e...|8589934594|
+--------------------+--------------------+----------+
'72dd0250-eff4-11e5-9ce9-5e5517507c66','dca16200-e462-11e5-90ec-c1cf090b354c','78be8951-ecca-11e5-a5f5-c1cf090b354c','4261cca0-f0e9-11e5-bbba-c1cf090b354c','98c7dc00-f0e5-11e5-bc76-c1cf090b354c','fe60c680-eb59-11e5-9582-c1cf090b354c','ff81457a-e9cf-11e5-9ce9-5e5517507c66','8d9680a0-ec14-11e5-a94f-c1cf090b354c','78be8950-ecca-11e5-a5f5-c1cf090b354c',
+--------------------+--------------------+-----------+
| id| family_id| child_id|
+--------------------+--------------------+-----------+
|fe60c680-eb59-11e...|fe60c680-eb59-11e...| 1|
|ff81457a-e9cf-11e...|ff81457a-e9cf-11e...| 2|
|98c7dc00-f0e5-11e...|98c7dc00-f0e5-11e...| 3|
|8d9680a0-ec14-11e...|8d9680a0-ec14-11e...| 4|
|4261cca0-f0e9-11e...|4261cca0-f0e9-11e...| 5|
|dca16200-e462-11e...|dca16200-e462-11e...| 6|
|78be8950-ecca-11e...|ff81457a-e9cf-11e...| 8589934593|
|dca16200-e462-11e...|ff81457a-e9cf-11e...| 8589934594|
|72dd0250-eff4-11e...|78be8950-ecca-11e...|17179869185|
|78be8951-ecca-11e...|78be8950-ecca-11e...|17179869186|
+--------------------+--------------------+-----------+
我知道它不会产生连续的值,这些值取决于分区。意外值意味着(参见第二个数据帧)那些 child_ids 属于前一个数据帧,其中 family_id = id 并匹配我正在使用 IN 的多个 ID。这里的意外值意味着 child_id 列没有来自上述数据框的值,而是使用 monoliticallyIncresingIds().
创建新的 child_id 列看到第二个数据帧中的最后 2 个值不属于上述数据帧。那么它从哪里来。我不会在数据框上再次应用 monoliticallyIncresingIds()
。那么,为什么它看起来像具有 monoliticallyIncresingIds()
值的列 (child_id) 再次应用。
但是,问题不在于 spark DataFrame 。当我们将 monoliticallyIncresingId() 与 DataFrame 一起使用时,它会在每次 DataFrame.show() 上创建新的 ID。
如果我们需要生成一次 id 并且需要在代码中的其他地方引用相同的 id 那么我们可能需要 DataFrame.cache().
在您的情况下,您需要在 Step1 之后缓存 DataFrame,这样它就不会每次都创建重复的 child_id 显示().