如何对比Hive表结构与S3存储CSV文件的DataFrame Schema?
验证S3 CSV文件与Hive表TableA的结构一致性
我来帮你对比这两个数据源的Schema一致性,先把两边的结构清晰呈现,再逐一分析匹配情况:
CSV文件对应的DataFrame Schema
| S_No | Variable | Type | Len | Format | Informat |
|---|---|---|---|---|---|
| 1 | DATETIME | Num | 8 | DATETIME20. | DATETIME20. |
| 2 | LOAD_DATETIME | Num | 8 | DATETIME20. | DATETIME20. |
| 3 | SOURCE_BANK | Char | 1 | null | null |
| 4 | EMP_NAME | Char | 50 | null | null |
| 5 | HEADER_ROW_COUNT | Num | 8 | null | null |
| 6 | EMP_HOURS | Num | 8 | 15.2 | 15.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




