我已经编写了一个简单的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");
在我上面的代码中,有没有一种方法可以创建除年,月,日列之外的一组列值以用作分区键?
答案 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(......)