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

获取Spark数据帧列列表

逄念
2023-03-14

如何将spark数据框中的所有列名放入Seq变量中。

输入数据

val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")

dataset1.printSchema()
root
|-- KEY1: string (nullable = true)
|-- KEY2: string (nullable = true)
|-- ID: string (nullable = true)

我需要使用scala编程将所有列名存储在变量中。我尝试了如下方法,但不起作用。

val selectColumns = dataset1.schema.fields.toSeq

selectColumns: Seq[org.apache.spark.sql.types.StructField] = WrappedArray(StructField(KEY1,StringType,true),StructField(KEY2,StringType,true),StructField(ID,StringType,true))

预期输出:

val selectColumns = Seq(
  col("KEY1"),
  col("KEY2"),
  col("ID")
)

selectColumns: Seq[org.apache.spark.sql.Column] = List(KEY1, KEY2, ID)

共有3个答案

锺离阿苏
2023-03-14

我像这样使用列属性

val cols = dataset1.columns.toSeq

然后,如果以后按照从头到尾的顺序选择所有列,则可以使用

val orderedDF = dataset1.select(cols.head, cols.tail:_ *)
劳嘉实
2023-03-14
val selectColumns = dataset1.columns.toList.map(col(_))
景建业
2023-03-14

您可以使用以下命令:

val selectColumns = dataset1.columns.toSeq
scala> val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")
dataset1: org.apache.spark.sql.DataFrame = [KEY1: string, KEY2: string ... 1 more field]

scala> val selectColumns = dataset1.columns.toSeq
selectColumns: Seq[String] = WrappedArray(KEY1, KEY2, ID)
 类似资料:
  • 我有一个简单的实例定义如下: 它看起来是这样的: 是否有任何方法只获取和的值?我尝试了以下操作: 但是获得错误键错误:('is_events_1','is_events_2')。

  • 如果我有一个包含以下列的数据帧: 我想能够说:这里是一个数据框,给我一个列的列表,它是类型Object还是类型DateTime? 我有一个将数字(Float64)转换为两位小数的函数,我想使用这个特定类型的dataframe列列表,并通过这个函数将它们全部转换为2dp。 也许 吧:

  • 我有一个包含大量列的Spark数据框架。我想从中删除两列以获得新的数据帧。 如果列更少,我可以在API中使用select方法,如下所示: 但是既然从长列表中挑选列是一项乏味的任务,有解决方法吗?

  • 我使用文件路径解析 Spark 数据帧,但现在我想将路径与时间一起作为单独的列添加到生成的数据帧中。下面是一个当前的解决方案(pathToDF 是一个帮助器方法): 我正在尝试做这样的事情,但我不确定如何使用Column添加时间列: 实现它的更好方法是什么? 输入自由度: 当前结果: 预期结果:

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

  • 我有两个数据帧df1(Employee表) 和 在我连接了df1.dept_id和df2.id上的这两个表之后: 同时将其保存在文件中, 它给出错误: 我读过有关使用字符串序列来避免列重复的信息,但这适用于要对其执行连接的列。我需要对未连接的列具有类似的功能。 有没有一种直接的方法可以将重复列嵌入表名以便保存? 我想出了一个解决方案,匹配两个df的列,并重命名重复的列,将表名附加到列名上。但是有直