Порядок столбцов Spark Union - PullRequest
0 голосов
/ 08 июля 2019

Недавно я встретил что-то странное в SparkНасколько я понимаю, учитывая метод хранения на основе столбцов spark dfs, порядок столбцов действительно не имеет никакого значения, они как ключи в словаре.

Во время df.union (df2) имеет значение порядок столбцов?Я бы предположил, что это не должно, но согласно мудрости форумов sql это делает.

Итак, у нас есть df1

df1
|  a|   b|
+---+----+
|  1| asd|
|  2|asda|
|  3| f1f|
+---+----+

df2
|   b|  a|
+----+---+
| asd|  1|
|asda|  2|
| f1f|  3|
+----+---+

result
|   a|   b|
+----+----+
|   1| asd|
|   2|asda|
|   3| f1f|
| asd|   1|
|asda|   2|
| f1f|   3|
+----+----+

Похоже, что использовалась схема из df1, но данные, по-видимому, соединились в порядке их исходных кадров данных.Очевидно, что решением было бы сделать df1.union (df2.select (df1.columns))

Но главный вопрос в том, почему он это делает?Это просто потому, что он является частью pyspark.sql, или в Spark есть какая-то базовая архитектура данных, которую я понял для понимания?

код для создания набора тестов, если кто-то хочет попробовать

d1={'a':[1,2,3], 'b':['asd','asda','f1f']}
d2={ 'b':['asd','asda','f1f'], 'a':[1,2,3],}
pdf1=pd.DataFrame(d1)
pdf2=pd.DataFrame(d2)
df1=spark.createDataFrame(pdf1)
df2=spark.createDataFrame(pdf2)
test=df1.union(df2)

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Объединение Spark реализовано в соответствии со стандартным SQL и поэтому разрешает столбцы по позиции.Это также указано в документации API :

Возвращает новый DataFrame, содержащий объединение строк в этом и другом кадре.

Это эквивалентно UNION ALLв SQL.Чтобы выполнить объединение наборов в стиле SQL (которое> дедуплицирует элементы), используйте эту функцию, за которой следует отдельная.

Также как стандарт в SQL, эта функция разрешает столбцы по позиции (не по имени).

0 голосов
/ 08 июля 2019

в Spark Union не выполняется для метаданных столбцов, и данные не перетасовываются, как вы думаете. скорее объединение выполняется по номерам столбцов, как в случае, если вы объединяете 2 Df, оба должны иметь одинаковое количество столбцов .. вам нужно будет принять во внимание положения ваших столбцов до выполнения объединения. в отличие от SQL, Oracle или других СУБД, лежащие в основе файлы - это физические файлы. надеюсь, что ответит на ваш вопрос

...