SparkSQL学习记录之三

本文深入探讨了SparkSQL中DataFrame接口的操作方法,包括加载和保存数据的多种方式,以及如何指定数据源选项。重点介绍了parquet格式的默认使用及数据源参数的传递。同时,解释了如何通过SQL查询文件数据,并详细阐述了SaveMode的不同模式及其对数据保存的影响。最后,介绍了如何使用HiveContext将DataFrame持久化为表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次我们讲讲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数据不会保存,不会改变存在的数据。
当使用HiveContext来进行工作,DataFrame能够以saveAsTable命令来被保存到一个持久化的表中。与registerTempTable 命令不同,saveAsTable会持久化dataframe的数据,并且在HiveMetastore中创建数据的指针。当你的spark应用重启之后,只要你一直维持对元数据的连接,持久化的表依然存在。通过在SQLContext使用table方法,传递table的名字,那么dataframe所关联的持久化表会被创建。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值