You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何对比Hive表结构与S3存储CSV文件的DataFrame Schema?

验证S3 CSV文件与Hive表TableA的结构一致性

我来帮你对比这两个数据源的Schema一致性,先把两边的结构清晰呈现,再逐一分析匹配情况:

CSV文件对应的DataFrame Schema

S_NoVariableTypeLenFormatInformat
1DATETIMENum8DATETIME20.DATETIME20.
2LOAD_DATETIMENum8DATETIME20.DATETIME20.
3SOURCE_BANKChar1nullnull
4EMP_NAMEChar50nullnull
5HEADER_ROW_COUNTNum8nullnull
6EMP_HOURSNum815.215.1

Hive表TableA的Spark Schema

获取Schema的Spark代码

import org.apache.spark.sql.hive.HiveContext
val targetTableName = "TableA"
val hc = new HiveContext(sc)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val targetRawData = hc.sql("Select datetime,load_datetime,trim(source_bank) as source_bank,trim(emp_name) as emp_name,header_row_count, emp_hours from " + targetTableName)
val schema= targetRawData.schema

输出的Schema结构

schema: org.apache.spark.sql.types.StructType = StructType(
    StructField(datetime,TimestampType,true), 
    StructField(load_datetime,TimestampType,true), 
    StructField(source_bank,StringType,true), 
    StructField(emp_name,StringType,true), 
    StructField(header_row_count,IntegerType,true), 
    StructField(emp_hours,DoubleType,true)
)

结构一致性对比分析

我们逐一对比每个字段的匹配情况:

  • DATETIME:CSV中为Num类型(长度8,格式DATETIME20.),对应Hive表的TimestampType。这里的Num应该是SAS风格的数值型日期,转换为Spark的TimestampType是合理的,类型逻辑一致。
  • LOAD_DATETIME:与DATETIME完全一致,CSV的Num类型和Hive表的TimestampType逻辑匹配。
  • SOURCE_BANK:CSV中为Char(1)类型,Hive表为StringType。Spark中没有专门的Char类型,StringType可以兼容Char类型的数据,只要CSV中该字段内容不超过1个字符,结构上是兼容的。
  • EMP_NAME:CSV中为Char(50)类型,Hive表为StringType。同样,StringType可以覆盖Char(50)的存储需求,只是Hive表没有显式限制长度,数据层面需确保CSV内容不超过50字符即可。
  • HEADER_ROW_COUNT:CSV中为Num(8)类型,Hive表为IntegerType。如果CSV中的该字段是整数范围的数值,IntegerType可以覆盖(注意:若存在超过Integer取值范围的数值,可能会出现溢出问题,需额外验证数据范围),类型基本匹配。
  • EMP_HOURS:CSV中为Num类型(输出格式15.2,输入格式15.1),Hive表为DoubleType。DoubleType可以处理带小数的数值,格式差异仅为输入输出的显示规则,底层数值类型匹配,一致性没问题。

整体来看,两个Schema的字段类型在Spark的处理逻辑下是基本兼容的,没有结构性的冲突。

内容的提问来源于stack exchange,提问作者Naveen Yadav

火山引擎 最新活动