Задача: мне нужно, чтобы значение столбца 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()
, применяется снова.
monoliticallyIncreasingId
не обязательно создает последовательные значения, поэтому эти скачки с ~6 до ~8 миллиардов не означают, что 8 миллиардов записей были пропущены. См. github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/ - person Tzach Zohar   schedule 09.04.2016monoliticallyIncresingIds()
. - person Parth Vishvajit   schedule 11.04.201617179869185
в столбце результата child_id, если они не существуют в промежуточном печатном результате? - person Tzach Zohar   schedule 11.04.201617179869185 , 17179869186
? а во-вторых, другие значения не такие, как ожидалось. Я имею в виду, просто взгляните на вышеприведенный фрейм данных, другие дочерние идентификаторы также не имеют значения. Похоже, методmonoliticallyIncresingId()
снова применился. и эти последние 2 значения отличаются, потому что они не находятся в том же разделе, что и другие (насколько я понимаю). - person Parth Vishvajit   schedule 11.04.2016