在 pyspark 列中访问名称

Access names within pyspark columns

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

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

简直returns

Column<b'array_1[columns]'>

而且没有名字。有什么方法可以访问数组中的名称?结构也会出现同样的问题。这将帮助我 loop/make 更轻松地发挥作用。如果可以避免各种模块,那将是有益的。

谢谢

您可以使用数据框的架构来查看列名。使用 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))
.....