Spark 与 Scala 中的 ETL 过程

Posted

技术标签:

【中文标题】Spark 与 Scala 中的 ETL 过程【英文标题】:ETL process in Spark with Scala 【发布时间】:2015-09-28 05:46:07 【问题描述】:

我正在使用 scala 在 Spark 中进行 ETL 过程。 原始日志文件包含两列名称和年龄。我的 ETL 过程读取并验证原始日志并生成另外两列,即标志和验证消息。 标志列指定行是否有效。(如果行有效= 1 else 0) 验证列指定行无效的原因。

例如。 原始日志文件

RAM,35
SAM,45
JAM,ww

这里最后一行是无效的,所以我的最终输出将是

RAM,35,1,""
SAM,45,1,""
JAM,ww,0,"invalid age"

我的scala代码是

import sqlContext._

val people = sc.textFile("hdfs://..../rawT.csv").map(_.split(","))

val base_people = people.mapr => val formatted_people = if(r(1).matches("^\\d*$")) ("1","") else ("0","Invalid Age");  (r(0), r(1), formatted_people)

但在这段代码中,RDD 生成为 base_people: org.apache.spark.rdd.RDD[(String, String, (String, String))]

我想要没有字符串数组的 RDD, base_people: org.apache.spark.rdd.RDD[(String, String, String, String)]

我的逻辑是正确的还是我需要遵循一些其他的代码。

【问题讨论】:

【参考方案1】:

您正在创建一个三元组,最后一个位置有一对,而不是四元组。怎么样:

val base_people = people
  .mapr => if(r(1).matches("^\\d*$"))
              (r(0), r(1), "1", "") 
            else 
              (r(0), r(1), "0", "Invalid Age")

【讨论】:

【参考方案2】:

有很多方法可以实现您想要实现的目标。以下是我的做法:

val base_people = data.map
  r => r(1) match 
   case i:Int => (r(0), r(1), "1", "") 
   case s:String => (r(0), r(1), "0", "invalid age")
  

我将在第二个字段上使用带有案例类(Int、String、Double 等)的模式匹配。你可以使用任何适合你的课程。

我希望这会有所帮助!

【讨论】:

如果您认为答案正确,您可以验证答案并投票

以上是关于Spark 与 Scala 中的 ETL 过程的主要内容,如果未能解决你的问题,请参考以下文章

spark过程

如何成为云计算大数据Spark高手

BI项目中的ETL设计详解(数据抽取清洗与转换 )

hadoop+spark详细的部署过程

spark安装部署

Spark-ETL日志数据清洗分析项目(上)--个人学习解析(保姆级)