使用boto3将S3的CSV导入QuickSight SPICE时修改字段类型报错
解决AWS QuickSight S3数据源字段类型设置问题
报错原因
这是AWS QuickSight的原生强制限制:S3作为物理数据源时,PhysicalTableMap中定义的InputColumns仅支持STRING类型,不允许直接在物理表层配置其他数据类型,因此你原来的代码会触发参数校验错误。
解决方案
你需要将类型转换操作放到逻辑表层处理,具体操作分两步:
- 第一步:先把物理表
InputColumns中所有字段的类型统一设置为STRING,通过物理层参数校验 - 第二步:新增
LogicalTableMap配置项,在逻辑表层通过类型转换操作将字段转为你需要的目标类型
修改后完整代码示例
response = client.update_data_set( AwsAccountId='AwsAccountId', DataSetId='DataSetId', Name='Name', PhysicalTableMap={ # 这里的键要和后续LogicalTableMap里的PhysicalTableId对应 's3_physical_table': { 'S3Source': { 'DataSourceArn': 'arn:aws:quicksight:us-east-1:AwsAccountId:datasource/DataSourceId', 'UploadSettings': { 'Format': 'CSV', 'StartFromRow': 1, 'ContainsHeader': True, 'Delimiter': ',' }, # 物理层所有字段统一设为STRING 'InputColumns': [ { 'Name': 'col1', 'Type': 'STRING' }, { 'Name': 'col2', 'Type': 'STRING' }, { 'Name': 'col3', 'Type': 'STRING' }, { 'Name': 'col5', 'Type': 'STRING' }, { 'Name': 'col6', 'Type': 'STRING' } ] } } }, # 新增逻辑表配置,做类型转换 LogicalTableMap={ 's3_logical_table': { 'Alias': 'S3数据集', 'Source': { 'PhysicalTableId': 's3_physical_table' }, 'DataTransforms': [ # 转换col1为日期类型,Format参数填写你实际的日期字符串格式 { 'CastColumnTypeOperation': { 'ColumnName': 'col1', 'NewColumnType': 'DATETIME', 'Format': 'yyyy-MM-dd HH:mm:ss' } }, # 转换col3为数值类型 { 'CastColumnTypeOperation': { 'ColumnName': 'col3', 'NewColumnType': 'DECIMAL' } }, # 转换col6为数值类型 { 'CastColumnTypeOperation': { 'ColumnName': 'col6', 'NewColumnType': 'DECIMAL' } } ] } }, ImportMode='SPICE' )
补充说明
如果你的日期或数值格式存在特殊字符,也可以在DataTransforms中先通过CalculateColumnOperation做字符串清洗,再做类型转换,转换后的字段效果和物理层直接定义的非STRING类型完全一致,不影响后续的分析、可视化操作。
内容的提问来源于stack exchange,提问作者FoCDoT
相关产品推荐
相关产品推荐

