在使用PySpark读取CSV时,是否可以只覆盖一种列类型?

uqzxnwby  于 2023-04-05  发布在  Spark
关注(0)|答案(2)|浏览(128)

我尝试使用PySpark读取一个包含许多列的CSV文件。inferschema选项在推断大多数列的数据类型方面非常出色。如果我只想覆盖其中一个被错误推断的列类型,最好的方法是什么?
我有这段代码,但它使PySpark只导入模式中指定的一个列,这不是我想要的。

schema = StructType() \ 
    .add("column_one_of_many", StringType(), True) 

spark.read.format('com.databricks.spark.csv') \ 
  .option('delimited',',') \ 
  .option('header','true') \ 
  .option('inferschema', 'true') \ 
  .schema(self.schema) \ 
  .load('dbfs:/FileStore/some.csv')

我的要求有可能吗?
谢谢你的时间和指导:)

wydwbb8l

wydwbb8l1#

更简单的方法是使用.withColumn并将column_one_of_many转换为字符串。

一米二米一x

from pyspark.sql.types import *

spark.read.format('com.databricks.spark.csv') \ 
  .option('delimited',',') \ 
  .option('header','true') \ 
  .option('inferschema', 'true') \ 
  .load('dbfs:/FileStore/some.csv')\
  .withColumn("column_one_of_many",col("column_one_of_many").cast("string"))

另一种方法是定义schema中的所有列,然后排除inferschema,只需使用**.schema**选项来读取csv文件。

wrrgggsh

wrrgggsh2#

或者你可以先在inferSchema打开的情况下读取它,修改schema,然后再次加载csv:

from pyspark.sql.types import *

df = spark.read.format('com.databricks.spark.csv') \ 
  .option('delimited',',') \ 
  .option('header','true') \ 
  .option('inferschema', 'true') \ 
  .load('dbfs:/FileStore/some.csv')

例如,让我们将第一列(索引为0)从IntegerType更改为StringType

df.schema.fields[0].dataType = StringType
schema = df.schema

然后,使用修改后的schema重新加载csv:

df = spark.read.format('com.databricks.spark.csv') \ 
  .option('delimited',',') \ 
  .option('header','true') \ 
  .option('schema', schema) \ 
  .load('dbfs:/FileStore/some.csv')

当然,您可以通过选择正确的索引来修改任何列的数据类型。这种方法比强制转换更好,因为您可能会因原始类型推断而丢失信息(例如,以零开头的邮政编码)。

相关问题