在 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))
.....
我需要一些帮助来访问列中的名称。例如,我有以下架构:
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))
.....