json解析 spark_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()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值