【问题标题】:Get field values from a structtype in pyspark dataframe从 pyspark 数据框中的结构类型获取字段值
【发布时间】:2019-07-02 02:51:49
【问题描述】:

我必须从 csv 文件中获取架构(列名和数据类型)。到目前为止,我已经达到了 -

l = [('Alice', 1)]
Person = Row('name', 'age')
rdd = sc.parallelize(l)
person = rdd.map(lambda r: Person(*r))
df2 = spark.createDataFrame(person)
print(df2.schema)
#StructType(List(StructField(name,StringType,true),StructField(age,LongType,true)))

我想提取值 nameage 以及 StringTypeLongType 但是我没有看到任何关于结构类型的方法。

scala 中有toDDL struct 类型的方法,但同样不适用于python。

这是我已经获得帮助的上述问题的扩展,但是我想创建一个新线程 - Get dataframe schema load to metadata table

感谢回复,我正在更新完整代码-

import pyspark # only run after findspark.init()
from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.sql.catalogImplementation", "in-memory") \
    .getOrCreate()
from pyspark.sql import Row
l = [('Alice', 1)]
Person = Row('name', 'age')
rdd = sc.parallelize(l)
person = rdd.map(lambda r: Person(*r))
df2 = spark.createDataFrame(person)
df3=df2.dtypes
df1=spark.createDataFrame(df3, ['colname', 'datatype'])
df1.show()
df1.createOrReplaceTempView("test")
spark.sql('''select * from test ''').show()

输出

+-------+--------+
|colname|datatype|
+-------+--------+
|   name|  string|
|    age|  bigint|
+-------+--------+

+-------+--------+
|colname|datatype|
+-------+--------+
|   name|  string|
|    age|  bigint|
+-------+--------+

【问题讨论】:

  • 我对您的最新编辑感到困惑 - 您是否回答了自己的问题?

标签: apache-spark pyspark


【解决方案1】:

IIUC,您可以遍历df2.schema.fields 中的值并获取namedataType

print([(x.name, x.dataType) for x in df2.schema.fields])
#[('name', StringType), ('age', LongType)]

还有dtypes

print(df2.dtypes)
#[('name', 'string'), ('age', 'bigint')]

你也可能对printSchema()感兴趣:

df2.printSchema()
#root
# |-- name: string (nullable = true)
# |-- age: long (nullable = true)

【讨论】:

  • PySpark 中来自 scala 的 .toDDL() 等函数怎么样
  • 你可以尝试类似:ddl = spark.sparkContext._jvm.org.apache.spark.sql.types.DataType.fromJson(schema_json).toDDL()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2021-12-17
  • 1970-01-01
  • 2023-03-16
  • 2015-03-19
  • 2023-02-23
  • 2021-06-06
相关资源
最近更新 更多