这次我们讲讲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/Java | Any Language | Meaning |
---|---|---|
SaveMode.ErrorIfExists (default) |
"error" (default) | 当保存dataframe到一个数据源时,如果该文件已存在,则一个异常会被抛出。 |
SaveMode.Append |
"append" | 当保存dataframe到一个数据源时,如果该文件已经存在,则会数据会追加到该数据之后。 |
SaveMode.Overwrite |
"overwrite" | 覆盖模式意味着当保存dataframe到一个数据源时,如果数据或者表已经存在了,存在的数据会被新来的dataframe数据所覆盖。 |
SaveMode.Ignore |
"ignore" | 忽略模式意味着当保存dataframe到一个数据源时,如果数据或者表已经存在了,新的dataframe数据不会保存,不会改变存在的数据。 |
registerTempTable
命令不同,saveAsTable会持久化dataframe的数据,并且在HiveMetastore中创建数据的指针。当你的spark应用重启之后,只要你一直维持对元数据的连接,持久化的表依然存在。通过在SQLContext使用table方法,传递table的名字,那么dataframe所关联的持久化表会被创建。
默认情况下,saveAsTable会创建一个管理表,数据的位置将要被云存储所控制。当一个表被删除,管理表会自动删除里面的数据。