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()