发布时间:2025-06-24 19:22:39  作者:北方职教升学中心  阅读量:169


  • 时间和日期解析:使用timestampFormatdateFormat。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、DROPMALFORMEDFAILFAST,默认值:PERMISSIVE。allowUnquotedFieldNames

      4.2.2 columnNameOfCorruptRecord

      指定存储解析失败记录的列名。ArrayType等模式,可以处理简单到复杂的JSON数据结构。allowSingleQuotes

    • MapType:键值对,类似于JSON中的键值结构。

    5. from_json总结

    from_json是Spark SQL中处理JSON数据的核心工具,它的核心是通过指定的schema将JSON字符串解析为结构化数据。

  • options(可选):用于指定解析选项(如是否允许解析失败、
  • 非标准JSON支持:使用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、以下是常用场景的总结:

    • 容错性控制:使用modecolumnNameOfCorruptRecord
    • 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、