zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    自定义布局模板
    单据状态图
    初识MongoDB(八)
    初识MongoDB(七)
    初识MongoDB(六)
    初识MongoDB(五)
    初识MongoDB(四)
    初识MongoDB(三)
    初识MongoDB(二)
    初识MongoDB(一)
  • 原文地址:https://www.cnblogs.com/mycd/p/7732664.html
Copyright © 2011-2022 走看看