apache-spark - 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"
}
解决方案
推荐阅读
- python - Paraview:在 python 中访问时间序列最小值/最大值
- android - 在 Android 中实现正则表达式的更好方法
- hibernate - Hibernate 会改变表本身吗?
- json - 从 CRM 集成到 Team Foundation Server 2018
- php - 使用 Phpspreadsheet 写 xlsx 的撇号问题
- active-directory - Active Directory 组列出成员用户,用户的条目未提及组
- python - 如何键入传递给 numpy.asarray 的变量以生成 2D 浮点数组?
- python - 如何使用两个不同函数的最终值在python中获取另一个值?
- java - 日期时区在查找“America/Punta_Arenas”位置的 ID 时遇到问题
- junit - 使用 ant 使用 mpirun 运行单元测试