ORC:按列值分组进行分区

时间:2019-01-23 16:55:31

标签: java apache-spark orc

我已经编写了一个简单的Java Maven应用程序,该应用程序依赖于spark-hive_2.11才能将JSON转换为ORC。

我当前的应用程序按年,月和日进行分区,然后将每个分区写为ORC文件,但是现在我需要按年,月,日和一组帐号进行分区。

注意:我不使用HDFS,Hive,Pig等。只是一个简单的Java应用程序,该应用程序使用Spark Session组织并随后将JSON记录转换为ORC文件。

作为一个例子(为简单起见,假设仅按年划分分区,而不是年,月和日),如果我有以下数据:

Year    Account
2009    Acct1
2009    Acct2
2009    Acct3
2009    Acct4
2009    Acct5
2009    Acct1
2009    Acct2
2009    Acct3

我想按年份和科目组(grouping 1: { Acct1, Acct2 }grouping 2: { Acct3, Acct4, Acct5 })进行分区,我希望ORC分区代表:

分区1:

Year    Account
2009    Acct1
2009    Acct2
2009    Acct1
2009    Acct2

分区2:

Year    Account
2009    Acct3
2009    Acct4
2009    Acct5
2009    Acct3

下面是我当前的代码:

sparkSession.read()
    .json("jsonFile.json")
    .toDF()
    .repartition(1)
    .write()
    .options(sparkOptions)
    .partitionBy("year","month","day")
    .mode(SaveMode.Overwrite)
    .orc("orcDir");

在我上面的代码中,有没有一种方法可以创建除年,月,日列之外的一组列值以用作分区键?

1 个答案:

答案 0 :(得分:0)

没有对此进行测试,但是您也可以尝试以下操作:

val acctGroup = List(List("Acct1","Acct2"),List("Acct3","Acct4","Acct5"))

for {account <- acctGroup} 
    df.where($"account".isin(account: _*)).select("*").show()

+----+-------+
|Year|Account|
+----+-------+
|2009|  Acct1|
|2009|  Acct2|
|2009|  Acct1|
|2009|  Acct2|
+----+-------+      

+----+-------+
|Year|Account|
+----+-------+
|2009|  Acct3|
|2009|  Acct4|
|2009|  Acct5|
|2009|  Acct3|
+----+-------+  

您可以尝试为每个组保存csv:

for {account <- acctGroup} 
    df.where($"account".isin(account: _*)).select("*").write.format(......)