Как упорядочить секционированный столбец в начале в Spark DataFrame?

У меня есть данные, которые выглядят так,

1,IN,abc
2,US,pqr
3,UK,rst
4,IN,xyz
5,US,lmn

Я создаю фрейм данных по этим данным, используя spark-2.4.5 (scala)

val df = spark.read.format("csv").option("header","false").load("file:///home/hduser/Desktop/demo.csv").toDF("id","country","name")

Теперь, когда я записываю данные в виде файла паркета, используя следующий код,

df.write.partitionBy("country").parquet("/ex_1/spark_parquet")

Вывод выглядит так,

+---+----+-------+
| id|name|country|
+---+----+-------+
|  3| rst|     UK|
|  1| abc|     IN|
|  4| xyz|     IN|
|  2| pqr|     US|
|  5| lmn|     US|
+---+----+-------+

В настоящее время разделенный столбец находится в последнем месте, есть ли способ, с помощью которого я могу добиться следующего вывода (с разделением на столбец страны)

Вывод должен быть в формате Parquet

+-------+----+---+
|country|name| id|
+-------+----+---+
|     UK| rst|  3|
|     IN| abc|  1|
|     IN| xyz|  4|
|     US| pqr|  2|
|     US| lmn|  5|
+-------+----+---+

person Sandeep Patil    schedule 17.11.2020    source источник
comment
Отвечает ли это на ваш вопрос? Столбец раздела перемещен до конца строки при сохранении файла в Parquet   -  person Chitral Verma    schedule 18.11.2020
comment
Спасибо за ваш ответ, ссылка, которой вы поделились, ответила на несколько моих вопросов, вопрос, который я задал, очень похож на тот, которым вы поделились, спасибо !!!   -  person Sandeep Patil    schedule 18.11.2020


Ответы (1)


1 - почему местоположение разделенного столбца является последним (Spark): вы можете проверить комментарий Chitral Verma: Столбец раздела перемещается в конец строки при сохранении файла в Parquet

2- если вы хотите изменить порядок столбцов, вы можете использовать select :

df.show()

+---+----+-------+
| id|name|country|
+---+----+-------+
|  3| rst|     uk|
|  1| abc|     IN|
|  4| xyz|     IN|
+---+----+-------+

val dataOrdoned =
  df.select(
    "country",
    "name",
    "id"
  )

dataOrdoned.show()

+-------+----+---+
|country|name| id|
+-------+----+---+
|     uk| rst|  3|
|     IN| abc|  1|
|     IN| xyz|  4|
+-------+----+---+

select — это преобразование, поэтому ваш вывод будет иметь тот же порядок, что и ваш набор данных.

dataOrdoned.write.csv("path/country.csv")

uk,rst,3
IN,abc,1
IN,xyz,4
person maxime G    schedule 17.11.2020
comment
Спасибо за ваш ответ. И можно выбрать данные так, как вы выбрали, мой вопрос больше касается разбиения и того, как работает разбиение, и можно ли записать вывод, изменив порядок секционированного столбца. - person Sandeep Patil; 18.11.2020
comment
для разделения проверьте комментарий Читрала. во второй части вашего комментария я обновил свой ответ - person maxime G; 18.11.2020
comment
Да, вы абсолютно правы, однако мне нужны секционированные данные на выходе, и когда мы перейдем к секционированию, расположение столбца изменится, мне нужен столбец «страна» в первом местоположении, но мне нужно, чтобы данные были секционированы, - person Sandeep Patil; 18.11.2020