当前位置: 首页 > 知识库问答 >
问题:

在Scala中更改任何Spark sql StructType的所有元素的可空属性的常用方法

松俊美
2023-03-14

是否有一种通用方法来更改任何指定StructType的所有元素的可空属性?它可能是嵌套的StructType。

我看到@eliasah将其标记为与Spark Dataframe列可空属性更改重复。但它们是不同的,因为它无法解决层次结构/嵌套结构类型,该答案仅适用于一个级别。

例如:

 root
 |-- user_id: string (nullable = false)
 |-- name: string (nullable = false)
 |-- system_process: array (nullable = false)
 |    |-- element: struct (containsNull = false)
 |    |    |-- timestamp: long (nullable = false)
 |    |    |-- process: string (nullable = false)
 |-- type: string (nullable = false)
 |-- user_process: array (nullable = false)
 |    |-- element: struct (containsNull = false)
 |    |    |-- timestamp: long (nullable = false)
 |    |    |-- process: string (nullable = false)

我想将nullalbe更改为true to all elements,结果应该是:

 root
 |-- user_id: string (nullable = true)
 |-- name: string (nullable = true)
 |-- system_process: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- timestamp: long (nullable = true)
 |    |    |-- process: string (nullable = true)
 |-- type: string (nullable = true)
 |-- user_process: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- timestamp: long (nullable = true)
 |    |    |-- process: string (nullable = true)

为了方便测试,随附了StructType的JSON模式示例:

val jsonSchema="""{"type":"struct","fields":[{"name":"user_id","type":"string","nullable":false,"metadata":{}},{"name":"name","type":"string","nullable":false,"metadata":{}},{"name":"system_process","type":{"type":"array","elementType":{"type":"struct","fields":[{"name":"timestamp","type":"long","nullable":false,"metadata":{}},{"name":"process_id","type":"string","nullable":false,"metadata":{}}]},"containsNull":false},"nullable":false,"metadata":{}},{"name":"type","type":"string","nullable":false,"metadata":{}},{"name":"user_process","type":{"type":"array","elementType":{"type":"struct","fields":[{"name":"timestamp","type":"long","nullable":false,"metadata":{}},{"name":"process_id","type":"string","nullable":false,"metadata":{}}]},"containsNull":false},"nullable":false,"metadata":{}}]}"""
DataType.fromJson(jsonSchema).asInstanceOf[StructType].printTreeString()

共有1个答案

韦星文
2023-03-14

最后得出以下两种解决方案:

>

  • 技巧一先替换字符串,然后从JSON字符串创建结构类型实例

    DataType.fromJson(schema.json.replaceAll("\"nullable\":false", "\"nullable\":true")).asInstanceOf[StructType]
    

    递归方法

      def updateFieldsToNullable(structType: StructType): StructType = {
        StructType(structType.map(f => f.dataType match {
          case d: ArrayType =>
            val element = d.elementType match {
              case s: StructType => updateFieldsToNullable(s)
              case _ => d.elementType
            }
            f.copy(nullable = true, dataType = ArrayType(element, d.containsNull))
          case s: StructType => f.copy(nullable = true, dataType = updateFieldsToNullable(s))
          case _ => f.copy(nullable = true)
        })
        )
      }
    

  •  类似资料:
    • 问题内容: 我需要JavaScript代码来遍历HTML元素中的填充属性。 这个ref表示我可以通过索引访问它,但是没有指定它是否受良好支持并且可以使用(跨浏览器)。 还是其他方式?(不使用任何框架,例如jQuery / Prototype) 问题答案: 这将在IE,Firefox和Chrome中运行(有人可以测试其他人吗?—谢谢@Bryan): 编辑:IE迭代有问题的DOM对象支持的 所有 属性

    • 问题内容: 如何使用WebDriverWait等待属性更改? 在我的AUT中,我必须等待按钮被启用后才能继续,但是不幸的是,由于开发人员对页面进行编码的方式,我无法使用WebElement的isEnabled()方法。开发人员正在使用一些CSS来使按钮看起来像已禁用,因此用户无法单击它,并且isEnabled方法始终为我返回true。因此,我要做的就是获取属性“ aria-disabled”,并检

    • 我有一个名为的简单函数: 我想知道除了这个以外,是否还有其他方法可以添加某些属性的值:等于,等于等。 我试过这样的方法: 但那行不通。我知道尝试它可能是愚蠢的(因为我的IDE说这个表达式不能分配给类型HTML元素^^')。

    • Hibernate的property元素具有update、insert属性,根据文档,它声明-http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-声明属性 update,insert(可选-默认为true):指定映射列应包含在SQL update和/或insert语句中。将两者都设置为f

    • 我有4个HTML元素,我需要知道它的属性(HTML5):a-download、href、hreflang、media、rel、target、键入img-alt、crossorigin、height、ismap、longdesc、size、src、srcset、usemap、width ol-reversed、start、键入td-headers、colspan、rowspan 还有吗?

    • 问题内容: 我试图遍历一个元素并获取该元素的所有属性以输出它们,例如,一个标签可能具有3个或更多属性,我不知道,我需要获取这些属性的名称和值。我在考虑以下方面: 谁能告诉我这是否可能,如果可以,正确的语法是什么? 问题答案: 该属性包含它们全部: 您还可以做的是扩展,以便可以像获取所有属性的普通对象一样调用它: 用法: