读写 JSON 格式文件

 

00a2a56f725d86b5c27463f109c43d8c

在 ETL 中, Spark 经常扮演 T 的职务, 也就是进行数据清洗和数据转换.

在业务系统中, JSON 是一个非常常见的数据格式, 在前后端交互的时候也往往会使用 JSON, 所以从业务系统获取的数据很大可能性是使用 JSON 格式, 所以就需要 Spark 能够支持 JSON 格式文件的读取

读写 JSON 文件

将要 Dataset 保存为 JSON 格式的文件比较简单, 是 DataFrameWriter 的一个常规使用

val spark: SparkSession = new sql.SparkSession.Builder()
  .appName("hello")
  .master("local[6]")
  .getOrCreate()

val dfFromParquet = spark.read.load("dataset/beijing_pm")

// 将 DataFrame 保存为 JSON 格式的文件
dfFromParquet.repartition(1)        -----1
  .write.format("json")
  .save("dataset/beijing_pm_json")

 

1--> 如果不重新分区, 则会为 DataFrame 底层的 RDD 的每个分区生成一个文件, 为了保持只有一个输出文件, 所以重新分区

保存为 JSON 格式的文件有一个细节需要注意, 这个 JSON 格式的文件中, 
每一行是一个独立的 JSON, 但是整个文件并不只是一个 JSON 字符串, 
所以这种文件格式很多时候被成为 JSON Line 文件, 有时候后缀名也会变为 jsonl

beijing_pm.jsonl
{"day":"1","hour":"0","season":"1","year":2013,"month":3}
{"day":"1","hour":"1","season":"1","year":2013,"month":3}
{"day":"1","hour":"2","season":"1","year":2013,"month":3}

也可以通过 DataFrameReader 读取一个 JSON Line 文件

val spark: SparkSession = ...

val dfFromJSON = spark.read.json("dataset/beijing_pm_json")
dfFromJSON.show()

JSON 格式的文件是有结构信息的, 也就是 JSON 中的字段是有类型的, 例如 "name": "zhangsan" 这样由双引号包裹的 Value, 就是字符串类型, 而 "age": 10 这种没有双引号包裹的就是数字类型, 当然, 也可以是布尔型 "has_wife": true

Spark 读取 JSON Line 文件的时候, 会自动的推断类型信息

val spark: SparkSession = ...

val dfFromJSON = spark.read.json("dataset/beijing_pm_json")

dfFromJSON.printSchema()

e8a53ef37bbf6675525d1a844f8648f1

Spark 可以从一个保存了 JSON 格式字符串的 Dataset[String] 中读取 JSON 信息, 转为 DataFrame

这种情况其实还是比较常见的, 例如如下的流程

da6f1c7f8d98691117a173e03bfdf18f

假设业务系统通过 Kafka 将数据流转进入大数据平台, 这个时候可能需要使用 RDD 或者 Dataset 来读取其中的内容, 这个时候一条数据就是一个 JSON 格式的字符串, 如何将其转为 DataFrame 或者 Dataset[Object] 这样具有 Schema 的数据集呢? 使用如下代码就可以

val spark: SparkSession = ...

import spark.implicits._

val peopleDataset = spark.createDataset(
  """{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}""" :: Nil)

spark.read.json(peopleDataset).show()

总结

1. JSON 通常用于系统间的交互, Spark 经常要读取 JSON 格式文件, 处理, 放在另外一处

2.  使用 DataFrameReader 和 DataFrameWriter 可以轻易的读取和写入 JSON, 并且会自动处理数据类型信息​​​​​​​

在Python中,我们可以使用json模块来读写JSON数据并进行格式化输出。首先,我们可以使用json.load()函数来读取JSON数据并将其转换为Python字典。例如,我们可以使用以下代码读取一个名为example.json的文件并将其转换为字典: ```python import json with open('example.json', 'r') as file: data = json.load(file) print(data) ``` 这将打开example.json文件并将其内容转换为一个字典,并将其打印出来。\[2\] 如果我们想要将Python字典转换为JSON格式并进行格式化输出,我们可以使用json.dumps()函数。例如,我们可以使用以下代码将一个名为load_dict的字典转换为JSON格式并进行格式化输出: ```python import json load_dict = {'one': 1, 'two': {2.1: \['a', 'b'\]}} with open("./format_json.json", 'w') as write_f: write_f.write(json.dumps(load_dict, indent=2, ensure_ascii=False)) with open("./format_json.json", 'r') as load_f: load_dict = json.load(load_f) print(load_dict) ``` 这将把load_dict字典转换为JSON格式并写入到名为format_json.json的文件中。然后,我们再次读取该文件并将其转换为字典,并将其打印出来。\[3\] #### 引用[.reference_title] - *1* [【Python读写JSON:格式化输出,让数据更清晰】](https://blog.csdn.net/update7/article/details/129680159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python读写JSON 格式化输出](https://blog.csdn.net/update7/article/details/129717519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python读写json 格式化输出](https://blog.csdn.net/jacke121/article/details/115438658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值