【问题标题】:pyspark: Specified data types in schema while creating dataframe don't reflect in datapyspark:创建数据框时模式中指定的数据类型不会反映在数据中
【发布时间】:2018-02-05 17:53:29
【问题描述】:

我正在 Spark 中创建一个数据框,并且我已将架构定义如下:

SCHEMA = StructType([StructField('s3_location', StringType()),
                     StructField('partition_date', StringType()),
                     StructField('table_name', StringType()),
                     StructField('column_name', StringType()),
                     StructField('data_type', StringType()),
                     StructField('number_of_nulls', LongType()),
                     StructField('min', DoubleType()),
                     StructField('max', DoubleType()),
                     StructField('mean', DoubleType()),
                     StructField('variance', DoubleType()),
                     StructField('max_length', LongType())])

我有一堆遵循这个确切模式的行,我正在按如下方式创建数据框:

DF = SPARK.createDataFrame(ROWS, schema=SCHEMA)

然后我将此数据帧写入 AWS S3 中的 CSV 文件:

DF.repartition(1).write.mode('append').partitionBy('partition_date').csv(SAVE_PATH,
                                                                      header=True)

此过程成功并在 S3 中创建 CSV 文件。现在,我在 AWS Glue 中抓取这个 S3 位置,它以不同的方式推断架构。我指定为DoubleType() 的所有字段都被推断为string。因此,如果我想使用 QuickSight 之类的工具对这些值运行任何聚合函数,我不能。

为什么会这样?有办法解决吗?

【问题讨论】:

  • 好像和Spark没什么关系。更多的是其他工具无法从 csv 推断架构。

标签: csv apache-spark pyspark spark-dataframe aws-glue


【解决方案1】:

CSV 是包含文本(即字符串)的无类型文件。

如果您告诉 AWS Glue 该表包含数字值,那么它将读取这些值是数字,但 AWS Glue 爬网程序无法识别您的数字值。这可能是因为您有一个标题行,也可能是因为引用了列,或者因为您没有指定。

如果您在 Glue 中手动创建表格,您将能够指定列的数据类型。以下是您可以从 Athena 控制台执行此操作的方法。

  1. 单击您的姓名表旁边的垂直省略号,然后选择Generate Create Table DDL
  2. 使用此查询的结果,修改 CREATE TABLE 查询 - you might use FLOAT, DOUBLE, or DECIMAL 中数值列的数据类型。
  3. 放下桌子(例如DROP TABLE myschema.mytable;
  4. 运行修改后的CREATE TABLE 脚本。保留 Glue 最初添加的所有表格属性很有用,这样任何下游进程都可以理解继续以相同的方式识别表格。

您能否在文件中包含数据类型并避免向 Glue 告知数据类型?是的! Use one of Glue's more structured file formats,例如 Parquet(Spark 的最爱)或 ORC。

【讨论】:

    【解决方案2】:

    在导入 CSV 文件时,Crawler 会自动分配列名。这可以通过以下方式解决:

    1. 架构编辑并保存。

      第一次抓取后在 Glue 控制台中编辑表架构。请使用必要的数据类型保存架构。

    2. 更改爬虫设置。

      由于您已指定将来运行的架构不会更改,请在第二次运行之前更新/编辑爬虫的输出配置选项(可选)(修复架构后 - 更改为双)。

    3. 选择忽略更改,不修改数据目录。

    4. 再次运行爬虫。它不会显示正在更新或添加的表格,但您的数据会以所需的格式填充。

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2021-05-17
      • 2021-09-06
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2018-02-19
      相关资源
      最近更新 更多