发布时间:2025-06-24 19:22:39 作者:北方职教升学中心 阅读量:169
timestampFormat
和dateFormat
。ArrayType等。这个函数在处理半结构化数据(如JSON日志、2. 数据结构内容(Schema 定义)
from_json
函数需要明确的模式定义(schema),以便将JSON字符串解析为结构化数据。
columnNameOfCorruptRecord
:如果解析失败,存储错误记录的列名,默认值:空值(无默认值)。如果设置了该选项,解析失败的JSON会存储在指定的列中,而不是默认的_corrupt_record
列。案例:allowUnquotedFieldNames
JSON数据:
{name:"Alice",age:25}
SQL查询:
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('allowUnquotedFieldNames','true'))ASparsedFROMjson_table;
输出:
+----------------+|parsed |+----------------+|{Alice, 25} |+----------------+
4.2.6 allowSingleQuotes
允许JSON中的字段名和字符串值使用单引号。
案例:allowSingleQuotes
JSON数据:
{'name':'Alice','age':25}
SQL查询:
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('allowSingleQuotes','true'))ASparsedFROMjson_table;
输出:
+----------------+|parsed |+----------------+|{Alice, 25} |+----------------+
4.2.7 allowComments
允许JSON数据中包含注释(如//
或/* */
)。模式可以是以下几种Spark SQL数据类型:
2.1 基本数据类型
StringType
:字符串IntegerType
:整数LongType
:长整型DoubleType
:双精度浮点型BooleanType
:布尔值TimestampType
:时间戳DateType
:日期
2.2 复杂数据类型
StructType
:结构体,类似于JSON对象。1. 基本用法
from_json
的主要作用是将JSON字符串解析为指定的Spark SQL数据类型(如StructType、DROPMALFORMED
或FAILFAST
,默认值:PERMISSIVE。allowUnquotedFieldNames
、4.2.2 columnNameOfCorruptRecord
指定存储解析失败记录的列名。ArrayType等模式,可以处理简单到复杂的JSON数据结构。
allowSingleQuotes
、MapType
:键值对,类似于JSON中的键值结构。
5. from_json
总结
from_json
是Spark SQL中处理JSON数据的核心工具,它的核心是通过指定的schema将JSON字符串解析为结构化数据。
options
(可选):用于指定解析选项(如是否允许解析失败、multiLine
、空值处理等)。allowUnquotedFieldNames
:是否允许字段名不使用引号,默认值:false。map类型的函数操作,这样能更加方便对字符串的解析。ArrayType等)。案例:timestampFormat 和 dateFormat
JSON数据:
{"name":"Alice","timestamp":"2023-01-01T12:00:00","birth_date":"1990-01-01"}
SQL查询:
SELECTfrom_json(json_string,'STRUCT<name: STRING, timestamp: TIMESTAMP, birth_date: DATE>',map('timestampFormat','yyyy-MM-dd\'T\'HH:mm:ss','dateFormat','yyyy-MM-dd'))ASparsedFROMjson_table;
输出:
+-------------------------------+|parsed |+-------------------------------+|{Alice, 2023-01-01 12:00:00, 1990-01-01}|+-------------------------------+
4.2.4 multiLine
指定是否允许JSON数据跨多行。
Spark SQL中的from_json
函数详解
在Spark SQL中,from_json
是一个用于解析JSON数据的函数,主要用于将JSON格式的字符串解析为结构化的数据(即StructType或其他Spark SQL数据类型)。
语法
from_json(json_string,schema[,options])
json_string
:要解析的JSON字符串。4.1 常见 Options 参数
mode
:控制解析模式:PERMISSIVE
、ArrayType
:数组,类似于JSON数组。
案例:mode参数
JSON数据:
{"name":"Alice","age":25}{"name":"Bob","age":"invalid"}{"name":"Charlie"}
SQL查询:
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('mode','PERMISSIVE'))ASparsedFROMjson_table;
输出(PERMISSIVE模式,失败的记录存储在_corrupt_record):
+----------------+|parsed |+----------------+|{Alice, 25} ||null ||null |+----------------+
如果使用
DROPMALFORMED
:SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('mode','DROPMALFORMED'))ASparsedFROMjson_table;
输出(解析失败的记录被丢弃):
+----------------+|parsed |+----------------+|{Alice, 25} |+----------------+
如果使用
FAILFAST
:SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('mode','FAILFAST'))ASparsedFROMjson_table;
输出:Spark会抛出解析失败的异常。
allowSingleQuotes
:是否允许字段名和字符串值使用单引号,默认值:true。
allowNumericLeadingZeros
:是否允许数字前置零,默认值:false。如果某些JSON数据解析失败,Spark会将失败的记录存储在_corrupt_record
列中。timestampFormat
:指定时间戳格式,默认值:yyyy-MM-dd’T’HH:mm:ss.SSSXXX。案例:columnNameOfCorruptRecord
JSON数据:
{"name":"Alice","age":25}{"name":"Bob","age":"invalid"}
SQL查询:
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('columnNameOfCorruptRecord','error_record'))ASparsedFROMjson_table;
输出:
+----------------+-------------------+|parsed |error_record |+----------------+-------------------+|{Alice, 25} |null ||null |{"name": "Bob",...}|+----------------+-------------------+
4.2.3 timestampFormat 和 dateFormat
用于指定时间戳和日期字段的解析格式。通过灵活定义StructType、以下是常用场景的总结:
- 容错性控制:使用
mode
和columnNameOfCorruptRecord
。 multiLine
:是否允许JSON跨行(即多行JSON),默认值:false。通常与schema(模式定义)结合使用,明确解析后数据的结构。如果你有具体的JSON数据或使用场景,可以提供详细信息,我可以进一步帮助你解析和定义适合的schema!from_json
处理完后,我们对拿到的结果可能还要关联的内容spark sql 对struct、FAILFAST
:如果发现解析错误,则直接抛出异常,停止执行。schema
:定义JSON数据结构的模式,可以是StructType、案例:multiLine
JSON数据:
{"name":"Alice","age":25}
SQL查询(multiLine=false,无法解析多行JSON):
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('multiLine','false'))ASparsedFROMjson_table;
输出:
+----------------+|parsed |+----------------+|null |+----------------+
SQL查询(multiLine=true,支持多行JSON):
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('multiLine','true'))ASparsedFROMjson_table;
输出:
+----------------+|parsed |+----------------+|{Alice, 25} |+----------------+
4.2.5 allowUnquotedFieldNames
允许JSON中的字段名不加引号。嵌套结构数据)时非常有用。
4.2 Options 参数详细解析与案例
4.2.1 mode
mode
用于控制解析模式,支持以下三种模式:
PERMISSIVE
(默认):尝试解析尽可能多的数据。allowComments
:是否允许JSON中存在注释(如//
或/* */
),默认值:false。
3. 使用示例
3.1 示例解析简单JSON
JSON数据:
{"name":"Alice","age":25}
SQL实现:
CREATEORREPLACETEMPVIEWjson_table ASSELECT'{"name": "Alice", "age": 25}'ASjson_string;SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>')ASparsedFROMjson_table;
输出结果:
+----------------+|parsed |+----------------+|{Alice, 25} |+----------------+
3.2 示例:解析嵌套JSON
JSON数据:
{"name":"Alice","info":{"age":25,"city":"New York"}}
SQL实现:
CREATEORREPLACETEMPVIEWjson_table ASSELECT'{"name": "Alice", "info": {"age": 25, "city": "New York"}}'ASjson_string;SELECTfrom_json(json_string,'STRUCT<name: STRING, info: STRUCT<age: INT, city: STRING>>')ASparsedFROMjson_table;
输出结果:
+-------------------------+|parsed |+-------------------------+|{Alice, {25, New York}} |+-------------------------+
3.3 示例:解析JSON数组
JSON数据:
[{"name":"Alice","age":25},{"name":"Bob","age":30}]
SQL实现:
CREATEORREPLACETEMPVIEWjson_table ASSELECT'[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]'ASjson_string;SELECTfrom_json(json_string,'ARRAY<STRUCT<name: STRING, age: INT>>')ASparsedFROMjson_table;
输出结果:
+--------------------------+|parsed |+--------------------------+|[{Alice, 25}, {Bob, 30}] |+--------------------------+
3.4 示例:解析并提取嵌套字段
JSON数据:
{"name":"Alice","info":{"age":25,"city":"New York"}}
SQL实现:
CREATEORREPLACETEMPVIEWjson_table ASSELECT'{"name": "Alice", "info": {"age": 25, "city": "New York"}}'ASjson_string;SELECTparsed.name ASname,parsed.info.age ASage,parsed.info.city AScityFROM(SELECTfrom_json(json_string,'STRUCT<name: STRING, info: STRUCT<age: INT, city: STRING>>')ASparsed FROMjson_table);
输出结果:
+-------+---+----------+|name |age|city |+-------+---+----------+|Alice |25 |New York |+-------+---+----------+
4. 常见选项(Options)
以下是from_json
中支持的常见options参数,以及它们的详细说明和使用案例。
DROPMALFORMED
:丢弃所有解析失败的记录。allowComments
等。默认值为false。dateFormat
:指定日期格式,默认值:yyyy-MM-dd。allowBackslashEscapingAnyCharacter
:是否允许反斜杠转义任意字符,默认值:false。案例:allowComments
JSON数据:
{"name":"Alice",// This is a comment"age":25}
SQL查询:
SELECTfrom_json(json_string,'STRUCT<name: STRING, age: INT>',map('allowComments','true'))ASparsedFROMjson_table;
输出:
+----------------+|parsed |+----------------+|{Alice, 25} |+----------------+
4.3 Options参数总结
from_json
的options参数提供了灵活的JSON解析配置,适用于各种复杂或非标准的JSON数据场景。array、