在spark

时间:2016-04-09 07:25:07

标签: scala apache-spark spark-dataframe

任务:我希望与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_id。

第3步:需要child_id和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.
    }

这是我的代码的输出。我试图在dataframe中获取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|
+--------------------+--------------------+-----------+

我知道它不会产生连续值,这些值是分区上的依赖项。意外值意味着(参见第2个数据帧)那些child_ids意味着属于之前的数据帧,其中family_id = id并匹配我使用IN的多个ID。这里的意外值意味着child_id列没有来自上述数据帧的值,而是使用monoliticallyIncresingIds()创建新的child_id列。

查看第二个数据帧中的最后2个值不属于上述数据帧。那么它来自哪里呢?我没有在数据框上再次应用monoliticallyIncresingIds()。那么,为什么看起来再次应用具有monoliticallyIncresingIds()值的列(child_id)。

1 个答案:

答案 0 :(得分:1)

然而,问题不在于spark DataFrame 。当我们将 monoliticallyIncresingId()与DataFrame一起使用时,它会在 DataFrame.show()上为每次创建新ID。

如果我们需要生成一次ID并且需要在代码中的其他位置引用相同的ID,那么我们可能需要 DataFrame.cache()

在您的情况下,您需要在 Step1 之后缓存DataFrame,以便每次在 show()时都不会创建重复的 child_id 。< / p>