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

为具有复杂列的DataFrame添加新列(数组<映射<字符串,字符串>)

伍皓
2023-03-14

我正在使用以下模式从外部源加载数据帧:

 |-- A: string (nullable = true)
 |-- B: timestamp (nullable = true)
 |-- C: long (nullable = true)
 |-- METADATA: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- M_1: integer (nullable = true)
 |    |    |-- M_2: string (nullable = true)
 |    |    |-- M_3: string (nullable = true)
 |    |    |-- M_4: string (nullable = true)
 |    |    |-- M_5: double (nullable = true)
 |    |    |-- M_6: string (nullable = true)
 |    |    |-- M_7: double (nullable = true)
 |    |    |-- M_8: boolean (nullable = true)
 |    |    |-- M_9: boolean (nullable = true)
 |-- E: string (nullable = true)

现在,我需要添加新列METADATA_PARSED,其中包含列类型数组和以下case类:

case类META_DATA_COL(M_1: String,M_2: String,M_3,M_10: String)

基于示例,我这里的方法是创建一个UDF并传递元数据列。但是由于它是一个复杂的类型,我在解析它时遇到了很多困难。

除此之外,对于UDF中的“new”变量M_10,我还需要对方法进行一些字符串操作。所以我需要访问元数据列中的每个元素。

处理这个问题的最佳方式是什么?我试图将源数据帧(元数据)转换为case类;但这不起作用,因为它在进入UDF时被转换回spark WrappedArray类型。

共有1个答案

黄英韶
2023-03-14

你可以用这样的东西。

import org.apache.spark.sql.functions._

val tempdf  = df.select(
  explode( col("METADATA")).as("flat") 
)

val processedDf = tempdf.select( col("flat.M_1"),col("flat.M_2"),col("flat.M_3"))

现在编写一个 udf


def processudf = udf((col1:Int,col2:String,col3:String) => /* do the processing*/)

这应该会有帮助,如果你能提供更多的处理细节,我可以提供更多的帮助。

 类似资料:
  • 问题内容: 我对Regex的经验不足,但是我已经阅读了很多。假设有一个字符串,我想要一个列表,该列表的字符串分为两个部分。我的方法是让一个小组检查是否是数字,然后检查该小组是否重复。像这样 我认为基本上可以检查“ digit”或“ digit +”是否相同。我认为这可以满足我的要求。 问题答案: 用途:

  • 从数据框列中删除字符串列表,如我的代码所示: 我的名单上会有 非常感谢。

  • 如何将字符串映射到列表,并将列表映射到字符串? 考虑到我们有以下班级 在Dozer和Orika中,我们可以使用以下代码行轻松映射 如何在MapStruct中进行相同类型的映射?在哪里可以找到有关mapstruct的更多示例?

  • 问题内容: 我试图将字符串数组作为参数传递给Wetland类的构造函数;我不明白如何将字符串数组的元素添加到字符串数组列表。 问题答案: 您已经具有内置方法:- 注 : -您应该使用没有。 返回一个不同的-> ,不能将其类型转换为。 然后,您将不得不使用方法,这不是很好。所以就用 注意 :-返回的列表是固定大小的列表。如果要向列表中添加某些内容,则需要创建另一个列表,并用于向其中添加元素。所以,那

  • 问题内容: 我是Java新手,所以我几乎不需要帮助 我有 我想向此数组(脚本)添加新的字符串(string1,string2)作为示例 我想在以后的阶段中不添加新字符串 我该怎么办? 问题答案: 您无法在Java中调整数组的大小。 声明数组的大小后,它将保持固定。 相反,您可以使用具有动态大小的对象,这意味着您无需担心其大小。如果数组列表的大小不足以容纳新值,则它将自动调整大小。