Spark SQL解析Json

学习链接:
https://www.shiyanlou.com/courses/809

首先切换用户:
su hadoop
hadoop

进入opt目录
cd /opt

第一次使用时,最好先把core-site.xml中的tmp文件位置改一下,然后格式化hdfs,
hadoop-2.6.1/bin/hdfs namenode -format

启动hadoop集群(可通过jps判断是否启动成功),创建person.json并上传到hdfs并查看
sudo vi person.json
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}

start-all.sh
hadoop fs -mkdir /testdata
hadoop fs -put person.json /testdata
hadoop fs -cat /testdata/person.json

启动spark和spark-shell(Spark On Yarn模式,jps出现Master和Worker)
spark-2.1.0-bin-hadoop2.6/sbin/start-all.sh
spark-2.1.0-bin-hadoop2.6/bin/spark-shell --master spark://db74499714f9:7077


使用Dataframe:
读取 json 文件,构造一个 untyped 弱类型的 dataframe
val df = spark.read.json("hdfs://localhost:9000/testdata/person.json")
df.show() //打印数据
df.printSchema() // 打印元数据
df.select($"name", $"age" + 1).show() // 使用表达式,scala的语法,要用$符号作为前缀
df.select("name").show() // select操作,典型的弱类型,untyped操作
df.createOrReplaceTempView("person") // 基于dataframe创建临时视图
spark.sql("SELECT * FROM person").show() // 用SparkSession的sql()函数就可以执行sql语句,默认是针对创建的临时视图

使用Dataset:
val sqlDS = Seq(1, 2, 3, 4, 5).toDS()
sqlDS.map(_*2).show()
基于已有的结构化数据文件,构造 dataset:
case class Person(name: String, age: Long)
val pds = spark.read.json("hdfs://localhost:9000/testdata/person.json").as[Person]
pds.show()
直接基于jvm object来构造dataset:
val caseDS = Seq(Person("Zhudy", 28)).toDS()
caseDS.show()
退出spark-shell
:quit

 

 

综合案例分析

编写department.json和employee.json文件,并上传至HDFS
department.json
{"id": 1, "name": "Tech Department"}
{"id": 2, "name": "Fina Department"}
{"id": 3, "name": "HR Department"}

employee.json
{"name": "zhangsan", "age": 26, "depId": 1, "gender": "male", "salary": 20000}
{"name": "lisi", "age": 36, "depId": 2, "gender": "female", "salary": 8500}
{"name": "wangwu", "age": 23, "depId": 1, "gender": "male", "salary": 5000}
{"name": "zhaoliu", "age": 25, "depId": 3, "gender": "male", "salary": 7000}
{"name": "marry", "age": 19, "depId": 2, "gender": "female", "salary": 6600}
{"name": "Tom", "age": 36, "depId": 1, "gender": "female", "salary": 5000}
{"name": "kitty", "age": 43, "depId": 2, "gender": "female", "salary": 6000}

hadoop fs -put department.json /testdata
hadoop fs -put employee.json /testdata

hadoop fs -cat hdfs://localhost:9000/testdata/department.json
hadoop fs -cat hdfs://localhost:9000/testdata/employee.json

加载数据
val emp = spark.read.json("hdfs://localhost:9000/testdata/employee.json")
val dep = spark.read.json("hdfs://localhost:9000/testdata/department.json")
计算每个部门不同性别员工的平均薪水和年龄。将两个表进行 join 操作才能根据部门名称和员工性别分组再进行聚合。
emp.join(dep, $"id" === $"depId") .groupBy(dep("name"), emp("gender")).agg(avg(emp("salary")), avg(emp("age"))).show()

转载于:https://www.cnblogs.com/mycd/p/7732664.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值