pyspark 列中的访问名称

Posted

技术标签:

【中文标题】pyspark 列中的访问名称【英文标题】:Access names within pyspark columns 【发布时间】:2021-11-05 00:54:28 【问题描述】:

我需要一些帮助才能访问列中的名称。例如,我有以下架构:

root
 |-- id_1: string (nullable = true)
 |-- array_1: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- id_2: string (nullable = true)
 |    |    |-- post: struct (nullable = true)
 |    |    |    |-- value: double (nullable = true)

通过使用

cols  = df.columns

我将获得根级别所有名称的列表,

cols = [id_1, array_1,...]

但是,我想访问其中的名称,例如'array_1'。使用

df.id_1.columns

简单返回

Column<b'array_1[columns]'>

而且没有名字。有什么方法可以访问数组中的名称?结构也会出现同样的问题。这将帮助我循环/使功能更容易。如果可以避免各种模块,那将是有益的。

谢谢

【问题讨论】:

【参考方案1】:

您可以使用数据框的架构来查看列名。使用 StructType 和 StructField api。在示例 scala-spark 代码中(根据您的需要优化此代码):

import org.apache.spark.sql.types._

case class A(a: Int, b: String)
val df = Seq(("a", Array(A(1, "asd"))), ("b", Array(A(2, "dsa")))).toDF("str_col", "arr_col")

println(df.schema)
> res19: org.apache.spark.sql.types.StructType = StructType(StructField(str_col,StringType,true), StructField(arr_col,ArrayType(StructType(StructField(a,IntegerType,false), StructField(b,StringType,true)),true),true))

val fields = df.schema.fields

println(fields(0).name)
> res22: String = str_col

println(fields(1).dataType.asInstanceOf[ArrayType].elementType)
> res23: org.apache.spark.sql.types.DataType = StructType(StructField(a,IntegerType,false), StructField(b,StringType,true))
.....

【讨论】:

以上是关于pyspark 列中的访问名称的主要内容,如果未能解决你的问题,请参考以下文章

pySpark:如何在数据框中的 arrayType 列中获取 structType 中的所有元素名称?

PySpark查找另一列中是否存在一列中的模式

Pyspark根据另一列的模式替换列中的字符串

Pyspark:连接列,其中名称在另一个列中给出

使用 Pyspark 或 SQL 从图像列中查找唯一图像名称

PySpark:如何在列中使用 Or 进行分组