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

Spark:在不使用“.*”星号运算符的情况下将结构类型列拆分为多列

边明煦
2023-03-14

我的Spark DataFrame中有一个StructType列,我想将其拆分为多个列。

case class Struct(FIELD_1: Int, FIELD_2: Int, FIELD_3: Int)

val df = Seq(
    (Struct(1,2,3), 2),
    (Struct(4,5,6), 3)
).toDF("col0", "col1")

df.show()
// df: org.apache.spark.sql.DataFrame = [col0: struct<FIELD_1: int, 
// FIELD_2: int ... 1 more field>, col1: int]
// +---------+----+
// |     col0|col1|
// +---------+----+
// |[1, 2, 3]|   2|
// |[4, 5, 6]|   3|
// +---------+----+

将其拆分为其组成组件的一种方法是使用。*运算符。简单地说:

df.select("col0.*", "col1").show()
// +-------+-------+-------+----+
// |FIELD_1|FIELD_2|FIELD_3|col1|
// +-------+-------+-------+----+
// |      1|      2|      3|   2|
// |      4|      5|      6|   3|
// +-------+-------+-------+----+

但是,如果我想先在返回结构的列上应用一些 UDF myUDF,那么使用 .* 方法变得不方便。是否有一个 flattenStruct-esque 方法或函数允许我这样做?

df.select(flattenStruct(myUDF($"col0")), "col1") 

共有1个答案

曾明诚
2023-03-14

您可以先在第一个DF中应用UDF,然后在下一个选择中使用*进行选择df.select(myUDF($“col0”)。作为(“col0”),“col1”)。选择($“col0.*”,“col2”)

 类似资料:
  • 我想从中的一列创建多个列,使用JavaSpark中的逗号分隔符。 我在中的一列中有一个带逗号的值,并希望使用逗号分隔符将其拆分为多列。我有以下代码: 输入 输出

  • 理想情况下,我希望这些新列也被命名。

  • 我有一个包含(我认为是)对的数据帧。 它看起来像这样: < code>Col2曾经包含一个< code>Map[String,String],我在上面做了一个< code>toList(),然后做了< code>explode()以获得原始Map中每个映射的一行。 我想将< code>Col2分成2列,并获得以下数据帧: 有谁知道如何做到这一点? 或者,有人知道如何将一个映射分解成多行(每个映射一

  • 问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!

  • 问题内容: 我想在不使用split的情况下拆分字符串。任何人都可以解决我遇到的问题,但是我找不到确切的逻辑。 问题答案: 我将假定这是家庭作业,因此我仅给出一些片段作为提示: 查找给定子串的所有出现的索引 这是一个与参数一起使用以查找较大字符串中所有出现的子字符串的示例: 字符串API链接 从指定的索引开始,返回指定子字符串首次出现在该字符串中的索引。如果不存在这种情况,则返回-1。 相关问题 在

  • 问题内容: 在此示例中,star运算符对输入参数列表做了什么? 具体来说,如果我使用star运算符运行该程序,它将打印: 如果没有星星运行它将打印: 问题答案: 该运营商解压缩参数列表。它允许您以列表项作为单独的参数来调用函数。 例如,如果is ,则等效于。