如何在sparkDataframe中将分区列排序到开头?

zsohkypk  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(395)

这个问题在这里已经有答案了

将文件保存到parquet时,分区列被移到行的末尾(2个答案)
上个月关门了。
我有这样的数据,

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

我正在使用spark-2.4.5(scala)在这个数据上创建一个Dataframe

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

现在,当我用下面的代码将数据写为Parquet文件时,

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|
+---+----+-------+

目前,分区列位于最后一个位置,是否有任何方法可以实现以下输出(在“country”列上进行分区)
输出应为Parquet格式

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

vatpfxk51#

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

相关问题