Spark SQL之 Dataframe/Dataset

Dataframe

我们可以理解为 Dataframe 就是按列组织的 Dataset,在底层做了大量的优化。Dataframe 可以通过很多方式来构造:比如结构化的数据文件,Hive表,数据库,已有的 RDD,Scala,Java,Python,R 等语言都支持 Dataframe。Dataframe 提供了一种 domain-specific language 来进行结构化数据的操作,这种操作也被称之为 untyped 操作,与之相反的是基于强类型的 typed 操作。

hadoop fs -mkdir /testdata
sudo vi person.json

{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}

hadoop fs -put person.json /testdata
hadoop fs -cat /testdata/person.json

启动sqark
spark-2.1.0-bin-hadoop2.6/sbin/start-all.sh

用 jps 查看 spark 进程是否启动
Master、Worker

在 spark 的 bin 目录下启动 spark-shell。

$ cd spark-2.1.0-bin-hadoop2.6/bin
# a4cd888f4ca9 是主机名,要与您 hostnane 显示的名字一致
$ ./spark-shell --master spark://a4cd888f4ca9:7077

读取 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

Dataset 的序列化机制基于一种特殊的 Encoder,来将对象进行高效序列化,以进行高性能处理或者是通过网络进行传输。

基于原始数据类型构造 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()

猜你喜欢

转载自blog.csdn.net/ywf331/article/details/80177600