SparkSQL学习记录之三

来源:互联网 发布:手机 电脑 相册软件 编辑:程序博客网 时间:2024/06/01 09:57

这次我们讲讲SparkSQL的数据源。

通过DataFrame接口,SparkSQL支持操作各种的数据源。DataFrame能够在普通的RDDs上被操作,也可被注册成一个临时表。将DataFrame注册成一个表,可以允许你使用SQL查询。下来我们讲讲如何使用一般的方法来加载和额保存数据,然后研究怎么指定要操作的数据源的选项。

为了简单说明,默认的数据源(parquet格式)将被用在所有的演示中。

val df = sqlContext.read.load("examples/src/main/resources/users.parquet")df.select("name", "favorite_color").write.save("namesAndFavColors.parquet")
你也可以给数据源传递一个额外的参数,来手动的制定数据源。数据源被指定需要写它的全部修饰名称,但是在内置数据源,你可以写它的名称的简写。而类型之间可以互相转换。

val df = sqlContext.read.format("json").load("examples/src/main/resources/people.json")df.select("name", "age").write.format("parquet").save("namesAndAges.parquet")
相比使用读取数据的API来加载数据到DataFrame去查询它,你也可以使用SQL直接查询该文件。

val df = sqlContext.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")
保存操作可以使用SaveMode,来指定如何处理存在的,参与的数据。我们要知道保存模式没有利用任何的锁机制也不是一个原子操作,这一点很重要。此外,当执行一个overwrite,在写新数据之前,旧数据会被删除。


Scala/JavaAny LanguageMeaningSaveMode.ErrorIfExists(default)"error"(default)当保存dataframe到一个数据源时,如果该文件已存在,则一个异常会被抛出。SaveMode.Append"append"当保存dataframe到一个数据源时,如果该文件已经存在,则会数据会追加到该数据之后。SaveMode.Overwrite"overwrite"覆盖模式意味着当保存dataframe到一个数据源时,如果数据或者表已经存在了,存在的数据会被新来的dataframe数据所覆盖。SaveMode.Ignore"ignore"忽略模式意味着当保存dataframe到一个数据源时,如果数据或者表已经存在了,新的dataframe数据不会保存,不会改变存在的数据。当使用HiveContext来进行工作,DataFrame能够以saveAsTable命令来被保存到一个持久化的表中。与registerTempTable 命令不同,saveAsTable会持久化dataframe的数据,并且在HiveMetastore中创建数据的指针。当你的spark应用重启之后,只要你一直维持对元数据的连接,持久化的表依然存在。通过在SQLContext使用table方法,传递table的名字,那么dataframe所关联的持久化表会被创建。

默认情况下,saveAsTable会创建一个管理表,数据的位置将要被云存储所控制。当一个表被删除,管理表会自动删除里面的数据。

0 0
原创粉丝点击