编译:诚历,阿里巴巴计算平台事业部 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氛围,欢迎钉钉扫码加入!
对开源大数据和感兴趣的同学可以加小编微信(下图二维码,备注“进群”)进入技术交流微信群。