【问题标题】:How to add large struct column to dataframe如何将大型结构列添加到数据框
【发布时间】:2017-08-17 06:16:09
【问题描述】:

我想向数据框添加一个结构列,但该结构有超过 100 个字段。
我了解到 case class 可以更改为 struct 列,但 case class 的字段限制不超过 22 个(在线 spark 为 1.6.3,scala 为 2.10.4)。
普通班可以这样做吗?我必须实现哪些功能或接口?
还有一个“org.apache.spark.sql.functions.struct”,但是好像不能设置struct的字段名。 先谢谢了。

【问题讨论】:

  • 如果可能,请选择 UDF。stackoverflow.com/questions/33826495/…
  • 我不明白你的意思是不能设置结构的字段名。你可以这样做 val fields =new StructField("name", StringType, false) :: new StructField("age", IntegerType, false) :: List(new StructField("age", IntegerType, false))
  • 谢谢巴拉吉雷迪。现在我已经有一个大约有 40 列的数据框,并且想添加一个类型为 struct 的新列。你的意思是我必须定义一个包含现有 40 个字段的新结构和包含 100 多个字段的新结构?
  • 较新版本的 spark 没有案例类的 22 个字段限制。 :)

标签: scala apache-spark apache-spark-sql case-class


【解决方案1】:

但似乎无法设置结构的字段名称。

你可以。例如:

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

spark.range(1).withColumn("foo", 
   struct($"id".alias("x"), lit("foo").alias("y"), struct($"id".alias("bar")))
).printSchema

root
 |-- id: long (nullable = false)
 |-- foo: struct (nullable = false)
 |    |-- x: long (nullable = false)
 |    |-- y: string (nullable = false)
 |    |-- col3: struct (nullable = false)
 |    |    |-- bar: long (nullable = false)

【讨论】:

  • 非常感谢,这正是我想要的。
【解决方案2】:

这个结构体不需要定义case类,可以这样创建结构体类型:

val struct =
  StructType(
    StructField("a", IntegerType, true) ::
    StructField("b", LongType, false) ::
    StructField("c", BooleanType, false) :: Nil)

这个结构可以有任意长度。

那么你可以这样读取数据帧

val df = sparkSession.read.schema(struct).//your read method

【讨论】:

  • 感谢您的回答。现在我已经有一个大约 40 列的数据框,并且想添加一个类型为 struct 的新列。你的意思是我必须定义一个新结构来结束现有的 40 个字段和新结构?
猜你喜欢
  • 2018-07-24
  • 2018-12-14
  • 1970-01-01
  • 2022-01-05
  • 2013-04-25
  • 2020-12-14
  • 1970-01-01
  • 2022-01-03
  • 2021-02-01
相关资源
最近更新 更多