Неожиданные значения столбца после условия IN в методе where() кадра данных в искре

Задача: мне нужно, чтобы значение столбца child_id [Which is generated using withColumn() method and monoliticallyIncreasingId() method] соответствовало столбцу family_id и id.

Позвольте мне объяснить шаги для выполнения моей задачи:

Шаг 1: 1. добавление 2 столбцов в фрейм данных. 1 с уникальным идентификатором и именем 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.
    }

Это вывод моего кода. Я пытаюсь получить значения 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. Неожиданные значения здесь означают, что столбец child_id не имеет значений из приведенного выше фрейма данных, вместо этого он создает новый столбец child_id с помощью monolitallyIncresingIds().

См. последние 2 значения во 2-м кадре данных, которые не принадлежат указанному выше кадру данных. Так откуда же это. Я не применяю monoliticallyIncresingIds() снова к кадру данных. Итак, почему похоже, что этот столбец (child_id), имеющий такие значения, как monoliticallyIncresingIds(), применяется снова.


person Parth Vishvajit    schedule 09.04.2016    source источник
comment
Почему такие неожиданные значения? Каковы ожидаемые значения? Обратите внимание, что monoliticallyIncreasingId не обязательно создает последовательные значения, поэтому эти скачки с ~6 до ~8 миллиардов не означают, что 8 миллиардов записей были пропущены. См. github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/   -  person Tzach Zohar    schedule 09.04.2016
comment
Я знаю, что он не выдает последовательных значений, эти значения зависят от разделов. Неожиданные значения означают (см. 2-й фрейм данных), что эти child_ids должны принадлежать предыдущему фрейму данных, где family_id = id, и соответствовать нескольким идентификаторам, которые я использую IN. Неожиданные значения здесь означают, что столбец child_id не имеет значений из приведенного выше фрейма данных, вместо этого он создает новый столбец child_id с monoliticallyIncresingIds().   -  person Parth Vishvajit    schedule 11.04.2016
comment
может ли кто-нибудь предложить мне, какую информацию я должен добавить для уточнения вопроса. значит, его можно рассмотреть или открыть заново. Или вы можете предложить мне то, что вы не получили. Я добавлю объяснение в свой вопрос, как я недавно сделал.   -  person Parth Vishvajit    schedule 11.04.2016
comment
Во-первых, сделайте это минимальным воспроизводимым примером (см. stackoverflow.com/help/mcve): только соответствующие столбцы, удалите несвязанные столбцы, чтобы читатели могли легко создать рабочий пример для тестирования в своей среде. Во-вторых, проверьте, каковы неожиданные значения - если я правильно понимаю (сейчас) - ваш актуальный вопрос звучит примерно так: Откуда берутся такие значения, как 17179869185 в столбце результата child_id, если они не существуют в промежуточном печатном результате?   -  person Tzach Zohar    schedule 11.04.2016
comment
Спасибо за ответ@Цах Зоар. По вашему предложению я удалил ненужные столбцы из первого фрейма данных. И да, теперь ты понял. Меня беспокоит то, откуда взялись эти 2 значения 17179869185 , 17179869186? а во-вторых, другие значения не такие, как ожидалось. Я имею в виду, просто взгляните на вышеприведенный фрейм данных, другие дочерние идентификаторы также не имеют значения. Похоже, метод monoliticallyIncresingId() снова применился. и эти последние 2 значения отличаются, потому что они не находятся в том же разделе, что и другие (насколько я понимаю).   -  person Parth Vishvajit    schedule 11.04.2016


Ответы (1)


Однако проблема не в искре DataFrame . Когда мы используем монолитическиIncresingId() с DataFrame, каждый раз будет создаваться новый идентификатор для DataFrame.show().

если нам нужно сгенерировать идентификатор один раз и нужно ссылаться на тот же идентификатор в другом месте кода, нам может потребоваться DataFrame.cache().

В вашем случае вам нужно кэшировать DataFrame после шага 1, чтобы он не создавал дубликаты child_id каждый раз при show().

person Uttam Kasundara    schedule 13.04.2016
comment
Ну, то, что вы говорите, правильно, я проверил это. Но я не мог этого понять. Как и почему это происходит на самом деле? Кстати, Thanxx.. @Uttam Kasundara - person Parth Vishvajit; 19.04.2016