SparkSQL(三)(案例)

数据:

需求:我们需要根据app id 也就是红线上的网站来确定是那一款APP 但是有的后面如第一条红线,他的后面是空的,我们就需要把后面是空的,对他进行赋值这是做好的一个文档 里面包含id 及后面的app名称  为了方便辨认是否替换我用了谐音字等\

做法:

这里还是先创建SparkSession对象 然后导入文件 将数据文件按逗号切分 我们只需要这个文件的前85位数据,所以我们后面加了判定条件 

然后我们Map处理数据 用ROW对象,确定每一个单独数据的数据类型 并给每一组确定名称

而后导入我们写的替换文档,同样用 : 号切分 因为就两个字段 所以我们直接确定数据类型和 字段名称 然后

createTempView 将它变成一张表

同理我们把原数据也变成一种表

而后SQL查询替换:

这里我们是一个判定替换 : 我们第一时间拿的是原表的 appname 但是如果他是空的 我就会去第二张表中去找 然后进行替换赋值  如果不为空那么将用第一张表的 appname 因为我们下面的数据牵扯到 计算总和 SUM 所以我们 group by 用 id 和 name 分区 (这里注意 在GROUP BY子句中,每个未聚合的字段都必须在SELECT列表中或者使用聚合函数进行处理。所以这里的appname列需要在SELECT列表中或者使用聚合函数进行处理才能通过语法检查。 ) 这里如果没有将appname 这个放在分区中 运行时它会报错 

Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 't1.`appname`' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;; Aggregate [appid#108], [appid#108, CASE WHEN (appname#109 = ) THEN appname#7 ELSE appname#109 END AS appname#265, sum(cast(CASE WHEN ((requestmode#103 = 1) && (processnode#130 >= 1)) THEN 1 ELSE 0 END as bigint)) AS ysqq#266L]

 也不能单独的只放APPname 两者需要同时存在分组中

最后我们将结果导出到本地形成一张表 

(这里.repartition(1) 是导出设置分区 我们默认设置1   

write.format("csv") 设置导出的类型

sava 设置输出的路径 (最后输出的地址一定要是不存在的)

show 如果后面   不填写 他会默认打印前20条数据 所以这里填写了1000 让他打印前1000条数据

)

结果:

这里可以看到它转换成功了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值