首页 > 解决方案 > PySpark:仅针对某些字段读取具有已定义固定类型的 JSON 文件

问题描述

我有一个要求,其中 JSON 文件的某些字段需要是 Struct 类型才能使我的转换工作,否则我会收到一个错误 -Can't extract value from <field>; need struct type but got string

spark 的隐式模式在这里没有用,因为相关字段的值可以在整个 JSON 文件中为 null,因此 spark 假定它是字符串类型。我不想在这里定义自己的模式,因为有大量字段(> 1000),而且我需要强制类型的只有少数字段。

我在读取文件后尝试投射字段,但出现错误due to data type mismatch: cannot cast string to struct<>

编辑:您可以参考此在 PySpark UDF 中使用 StructType 列,以获取有关我正在处理的转换的更多详细信息。

一个非常高级的架构,

- root:
  - a_time:
    - time_to_resolution_remainingTime
     ....
  - b_time:
    - time_to_resolution_remainingTime
    ....

在我的用例中,该a_time字段可能完全为 null,从而导致 spark 为其分配字符串类型。


...
{
   "name":"time_to_resolution",
      "nullable":true,
      "type":{
        "fields":[
          {
            "metadata":{
              
            },
            "name":"_links",
            "nullable":true,
            "type":{
              "fields":[
                {
                  "metadata":{
                    
                  },
                  "name":"self",
                  "nullable":true,
                  "type":"string"
                }
              ],
              "type":"struct"
            }
          },
          {
            "metadata":{
              
            },
            "name":"completedCycles",
            "nullable":true,
            "type":{
              "containsNull":true,
              "elementType":{
                "fields":[
                  {
                    "metadata":{
                      
                    },
                    "name":"breached",
                    "nullable":true,
                    "type":"boolean"
                  },
                  {
                    "metadata":{
                      
                    },
                    "name":"elapsedTime",
                    "nullable":true,
                    "type":{
                      "fields":[
                        {
                          "metadata":{
                            
                          },
                          "name":"friendly",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"millis",
                          "nullable":true,
                          "type":"long"
                        }
                      ],
                      "type":"struct"
                    }
                  },
                  {
                    "metadata":{
                      
                    },
                    "name":"goalDuration",
                    "nullable":true,
                    "type":{
                      "fields":[
                        {
                          "metadata":{
                            
                          },
                          "name":"friendly",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"millis",
                          "nullable":true,
                          "type":"long"
                        }
                      ],
                      "type":"struct"
                    }
                  },
                  {
                    "metadata":{
                      
                    },
                    "name":"remainingTime",
                    "nullable":true,
                    "type":{
                      "fields":[
                        {
                          "metadata":{
                            
                          },
                          "name":"friendly",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"millis",
                          "nullable":true,
                          "type":"long"
                        }
                      ],
                      "type":"struct"
                    }
                  },
                  {
                    "metadata":{
                      
                    },
                    "name":"startTime",
                    "nullable":true,
                    "type":{
                      "fields":[
                        {
                          "metadata":{
                            
                          },
                          "name":"epochMillis",
                          "nullable":true,
                          "type":"long"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"friendly",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"iso8601",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"jira",
                          "nullable":true,
                          "type":"string"
                        }
                      ],
                      "type":"struct"
                    }
                  },
                  {
                    "metadata":{
                      
                    },
                    "name":"stopTime",
                    "nullable":true,
                    "type":{
                      "fields":[
                        {
                          "metadata":{
                            
                          },
                          "name":"epochMillis",
                          "nullable":true,
                          "type":"long"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"friendly",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"iso8601",
                          "nullable":true,
                          "type":"string"
                        },
                        {
                          "metadata":{
                            
                          },
                          "name":"jira",
                          "nullable":true,
                          "type":"string"
                        }
                      ],
                      "type":"struct"
                    }
                  }
                ],
                "type":"struct"
              },
              "type":"array"
            }
          }

另一个具有相同结构但由于所有空值而分配为字符串的字段。

{
      "metadata":{
        
      },
      "name":"time_to_resolution_b",
      "nullable":true,
      "type":"string"
}

标签: apache-sparkpyspark

解决方案


推荐阅读