編譯:誠曆,阿裡巴巴計算平台事業部 EMR 技術專家,Apache Sentry PMC,Apache Commons Committer,目前從事開源大資料存儲和優化方面的工作。
原文連結 :
http://blog.madhukaraphatak.com/data-modeling-spark-part-2/資料模組化是資料分析重要的組成之一,正确的建立模型有助于使用者更好地解答業務相關的問題。在過去幾十年中,資料模組化技術也一直是SQL資料倉庫的基礎。
Apache Spark作為新一代的數倉技術的代表,我們能夠在 Spark 中使用早期的資料模組化技術。這使得Spark data pineline 更加有效。
在本系列文章中,我将讨論spark中不同的資料模組化。本系列的第二篇文章中将讨論如何處理多個日期。
多個日期列
在上一篇文章中,我們讨論了如何處理單個日期列的資料分析。單一日期列在許多資料集中很常見。是以,前面文章中讨論的政策是有效的。
但是,有些資料集可能需要針對多個日期列分析資料。那麼在之前的文章中所讨論的政策是不夠的。是以,我們需要擴充日期次元邏輯來容納多個日期列。
将發行日期添加到股票資料
下面的代碼向股票資料添加了一個名為issue_date的日期列,以模拟多個日期的場景。
val appleStockDfWithIssueDate = appleStockDf.
withColumn("issue_date",add_months(appleStockDf("Date"),-12))
現在,如果使用者希望根據表示交易日期的日期列和表示給定股票何時發行的釋出日期列進行分析,那麼我們需要使用多個日期維。
帶有新字首的日期次元
為了分析多個日期,我們需要多次連接配接日期次元。我們需要使用不同字首的資料維來建立視圖,這樣我們就可以完成相同的工作。
val issueDateSchema = StructType(dateDf.schema.fields.map(value =>
value.copy(name = "issue_"+value.name)))
val issueDf = sparkSession.createDataFrame(dateDf.rdd, issueDateSchema)
在上面的代碼中,我們建立了一個名為issueDf的新df,它為所有列添加了一個名為issue的字首,表示将這個日期次元組合為issue_date。
三路join
一旦我們準備好了新的日期次元,現在我們就可以連接配接股票資料中的兩個日期了。
val twoJoinDf = appleStockDfWithIssueDate.join(dateDf, appleStockDfWithIssueDate.col("Date") ===
dateDf.col("full_date_formatted"))
.join(issueDf, appleStockDfWithIssueDate.col("issue_date") === issueDf.col("issue_full_date_formatted"))
發行日期分析
一旦我們做了連接配接,我們可以分析發行日期如下
twoJoinDf.groupBy("issue_year","issue_quarter").
avg("Close").
sort("issue_year","issue_quarter")
.show()
代碼
文本示例代碼可以在 github 上檢視
https://github.com/phatak-dev/spark2.0-examples/blob/2.4/src/main/scala/com/madhukaraphatak/examples/sparktwo/datamodeling/DateHandlingExample.scala阿裡巴巴開源大資料技術團隊成立Apache Spark中國技術社群,定期推送精彩案例,技術專家直播,問答區近萬人Spark技術同學線上提問答疑,隻為營造純粹的Spark氛圍,歡迎釘釘掃碼加入!
對開源大資料和感興趣的同學可以加小編微信(下圖二維碼,備注“進群”)進入技術交流微信群。