spark sql 因为引用变量日期没有加引号,导致没有读取到数据

spark sql 因为引用变量日期没有加引号,导致没有读取到数据
在这里插入图片描述

任务描述 相关知识 数据SQL 语句数据 文件保存 保存模式 持久化存储到 Hive 分区与排序 编程要求 测试说明 任务描述 本关任务:根据编程要求,编写 Spark 程序读取指定数据源,完成任务。 相关知识 为了完成本关任务,你需要掌握: 数据载; SQL 语句数据; 文件保存; 保存模式; 持久化存储到 Hive; 分区与排序。 数据载 在 Spark SQL 中使用 DataFrameReader 接口来读取外部存储文件,直接调用由 SparkSession 创建的对象来调用接口提供的 read 方法来完成数据载,读取后生成的对象是一个 DataFrame 格式的数据集。 读取示例: spark.read.load(file_path) 但是要注意的是,Spark SQL 读取的默认数据源格式为 Parquet 文件格式,可以通过修改配置项 spark.sql.sources.default 来更改读取的默认数据源格式。 当读取数据源并非默认的 Parquet 格式时,则需要手动指定它的数据源格式。在 Spark SQL 中提供了各类文件载的方法,如:json, jdbc, csv, text 等,直接调用对应的方法即可完成指定文件格式的读取读取示例: spark.read.json(file_path) 我们也可以调用 createOrReplaceTempView(viewName: String) 方法将读取数据创建为一个临时注册表,直接编写使用 SQL 语句对数据进行相关操作。 创建示例: spark.read.json(file_path).createOrReplaceTempView(data) spark.sql("select * from data") SQL 语句数据Spark SQL 中除了使用 DataFrameReader 接口来读取外部存储文件,还可以使用 Sql 语句直接将文件载到 DataFrame 中并进行查询。 读取示例: spark.sql("select * from json.`file path`") 注意文件路径要使用英文反引号 `` 包起来。 文件保存 在 Spark SQL 中使用 DataFrameWriter 接口来保存文件,直接调用由 SparkSession 创建的对象来调用接口提供的 write 方法来完成数据保存,保存后会生成一个文件夹。 保存示例: dataFrame.write.save(path) 保存后会生成一个文件夹,其中的文件如下图所示: 保存模式 在 Spark SQL 中提供了四种保存模式,用于设置保存时执行的操作,直接调用 DataFrameWriter 接口提供的 .write.mode() 方法来实现,详细参数如下表: 参数 含义 SaveMode.ErrorIfExists(默认) 保存的数据如果存在,则会抛出异常。 SaveMode.Append 采用追的方式保存数据。 SaveMode.Overwrite 采用覆盖的方式保存数据。 SaveMode.Ignore 保存的数据如果存在,则忽略,不做任何操作 保存示例: dataFrame.write.mode(SaveMode.Append).save(path) 持久化存储到 Hive 在 Spark SQL 中提供了 saveAsTable() 方法将数据持久化存储到 Hive 数据库中,但是要注意,使用该方法时需要先部署好 Hive 的相关集群环境,否则无法使用。Spark 会创建一个默认的本地 Hive 数据库,默认使用 Derby 作为元数据库。 保存示例: dataFrame.write.saveAsTable() 分区与排序 分区与排序常常用于文件的输出操作,也就是文件的保存操作,在 Spark SQL 中提供了 repartition(int n)方法用于设置分区,sort(sortCol: String, sortCols: String*) 或 orderBy(sortCol: String, sortCols: String*) 方法用于设置排序,默认为升序。 分区示例: dataFrame.repartition(2) 排序示例: // 升序 dataFrame.orderBy("age") // 降序 dataFrame.orderBy(dataFrame.col("age").desc) 编程要求 打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完善程序。读取本地文件 file:///data/bigfiles/demo.json,根据年龄字段 age 设置降序,输出结果。 demo.json 文件内容如下所示: {"name": "zhangsan", "age": 20, "sex": "m"}, {"name": "lisi", "age": 21, "sex": "m"}, {"name": "tiantian", "age": 22, "sex": "f"}, {"name": "lihua", "age": 23, "sex": "f"}, {"name": "zhaoliu", "age": 24, "sex": "m"}, {"name": "liguanqing", "age": 25, "sex": "f"}, {"name": "zhangqi", "age": 26, "sex": "m"}, {"name": "zhaoai", "age": 27, "sex": "m"}, {"name": "wangjiu", "age": 28, "sex": "f"} 开始任务前,注意先启动 Hadoop 与 Hive 环境:start-all.sh、nohup hive --service metastore &
03-18
好的,下面是对您提到的任务的整体解析以及解决方案的详细介绍: ### 解决方案概述 本次任务的核心在于通过 Spark 编程模型完成一系列操作:从读取 JSON 文件到按照特定字段排序,并最终输出结果。以下是具体的步骤及其实现细节。 --- #### **1. 数据载** 首先需要使用 `DataFrameReader` 接口载本地 JSON 文件。可以利用 `spark.read.json()` 方法来实现此功能。 **代码示例:** ```scala val jsonData = spark.read.json("file:///data/bigfiles/demo.json") ``` 在这里我们指定了路径 `"file:///data/big/files/demo.json"`,这是文件所在的绝对路径。 --- #### **2. 分区与排序** 接下来依据题目需求按年龄 (`age`) 字段进行降序排列。这一步可通过调用 `orderBy` 方法结合列对象的 `.desc` 属性轻松达成。 **代码示例:** ```scala import org.apache.spark.sql.functions._ val sortedData = jsonData.orderBy(col("age").desc) ``` 上述代码实现了基于 `age` 列值进行递减顺序排布的功能。 --- #### **3. 输出结果** 最后阶段就是展示处理后的数据框内容了。可以直接应用 `show()` 函数查看前若干行记录。 **代码示例:** ```scala sortedData.show() ``` 至此整个流程就完整地呈现出来了! --- ### 完整代码示范 下面是综合以上所有环节的一个完整 Scala 脚本实例: ```scala import org.apache.spark.sql.{SparkSession, functions => F} object SortJsonData { def main(args: Array[String]): Unit = { // 初始化 Spark Session val spark = SparkSession.builder() .appName("Sort Json Data by Age Descendingly") .enableHiveSupport() // 如果后续需要用到 Hive 功能则需启用此项 .getOrCreate() import spark.implicits._ try{ // 载JSON文件进DataFrame val jsonData = spark.read.json("file:///data/bigfiles/demo.json") // 按照 'age' 字段降序排序 val resultDF = jsonData.sort(F.desc("age")) // 打印前几条记录供验证 resultDF.show() } finally { spark.stop() } } } ``` 上面展示了如何构造应用程序去满足给定条件下的各项要求。请注意实际运行时还需保证必要的依赖库均已引入并且环境变量设置无误。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值