尝试通过从 S3 存储桶导入 CSV 在 Quicksight 中自动创建数据集时,尝试通过从 Java API 调用 createDataSet() 方法创建数据集时收到错误:
com.amazonaws.services.quicksight.model.InvalidParameterValueException:物理表 PrimaryTable 中的输入列 Year 的类型无效。 S3 物理表允许的类型为 [String](服务:AmazonQuickSight;状态代码:400;错误代码:InvalidParameterValueException;请求 ID:84d3da22-4e4e-45e0-8bbf-9d01975206b0;代理:null) 相关代码如下,其中第六行inputColumns.add导致错误:
inputColumns.add(new InputColumn().withName("Column 1").withType(InputColumnDataType.STRING));
inputColumns.add(new InputColumn().withName("Column 2").withType(InputColumnDataType.STRING));
inputColumns.add(new InputColumn().withName("Column 3").withType(InputColumnDataType.STRING));
inputColumns.add(new InputColumn().withName("Column 4").withType(InputColumnDataType.STRING));
inputColumns.add(new InputColumn().withName("Column 5").withType(InputColumnDataType.STRING));
inputColumns.add(new InputColumn().withName("Year").withType(InputColumnDataType.INTEGER)); //*hits the error on this line*
... //more columns with types STRING, INTEGER, and DECIMAL
s3source.setDataSourceArn(QS_BASE_ARN + "datasource/" + sourceName);
s3source.setInputColumns(inputColumns);
uploadSettings.setFormat(FileFormat.CSV.name());
uploadSettings.setContainsHeader(true);
uploadSettings.setDelimiter(",");
s3source.setUploadSettings(uploadSettings);
physicalTable.setS3Source(s3source);
Map<String, PhysicalTable> physicalTableMap = new HashMap<String, PhysicalTable>();
physicalTableMap.put("PrimaryTable", physicalTable);
newDataSet.withAwsAccountId(ACCOUNT_ID).withDataSetId(dataSetId).withName(dataSetName).withPhysicalTableMap(physicalTableMap).withImportMode("SPICE"); //These are all the required parameters for the API request
permissions.add(new ResourcePermission().withPrincipal(QS_BASE_ARN + "user/default/" + username).withActions("quicksight:UpdateDataSetPermissions","quicksight:DescribeDataSet","quicksight:DescribeDataSetPermissions","quicksight:PassDataSet", "quicksight:DescribeIngestion", "quicksight:ListIngestions", "quicksight:UpdateDataSet", "quicksight:DeleteDataSet","quicksight:CreateIngestion","quicksight:CancelIngestion"));
newDataSet.setPermissions(permissions);
try {
return getClient().createDataSet(newDataSet); //Creates SPICE dataset
} catch (SdkClientException e) {
throw e;
}
getClient() 方法是:
private static AmazonQuickSight getClient() {
final AWSCredentialsProvider credsProvider = new AWSCredentialsProvider() {
@Override
public AWSCredentials getCredentials() {
// provide actual IAM access key and secret key here
return new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
}
@Override
public void refresh() {}
};
return AmazonQuickSightClientBuilder
.standard()
.withRegion(Regions.US_EAST_1.getName())
.withCredentials(credsProvider)
.build();
}
API 文档说 STRING |整数|小数 |日期时间 |比特 |布尔 | JSON 均被接受,但错误消息和测试表明仅接受 STRING 作为类型(API 文档:https://docs.aws.amazon.com/quicksight/latest/APIReference/API_InputColumn.html)。
此错误是由 API 不接受它所说的数据类型引起的还是由我的设置引起的?
我知道我迟到了 18 个月,但我也为此苦苦挣扎,最终找到了解决方案。物理表映射只是将要读取的列映射到 QuickSight,但是(除非您的 S3 源文件是 JSON),您需要创建一个 LogicalTableMap 将任何列转换为所需的数据类型。我使用Java SDK V2,但V1非常相似。
LogicalTableSource logicalTableSource = LogicalTableSource.builder().physicalTableId("PrimaryTable").build();
ArrayList<TransformOperation> dataTransforms = dataTransforms();
LogicalTable logicalTable = LogicalTable.builder().alias("LogicalTableAlias").dataTransforms(dataTransforms)
.source(logicalTableSource).build();
Map<String, LogicalTable> logicalTableMap = new HashMap<String, LogicalTable>();
logicalTableMap.put("LogicalTableMap", logicalTable);
CreateDataSetRequest createDataSetRequest = CreateDataSetRequest.builder()
.awsAccountId(AwsAccountID)
.dataSetId(dataSetId)
.name(name)
.physicalTableMap(physicalTableMap)
.logicalTableMap(logicalTableMap)
.permissions(permissions)
.importMode(DataSetImportMode.SPICE)
.build();
// Create data set
getClient().createDataSet(createDataSetRequest);
dataTransforms() 方法是:
private static ArrayList<TransformOperation> dataTransforms() {
ArrayList<TransformOperation> dataTransforms = new ArrayList<TransformOperation>();
// Cast "Year" column as INTEGER
CastColumnTypeOperation castYear = CastColumnTypeOperation.builder()
.columnName("Year").newColumnType(ColumnDataType.INTEGER).build();
TransformOperation yearTransform = TransformOperation.builder()
.castColumnTypeOperation(castYear).build();
dataTransforms.add(yearTransform);
return dataTransforms;
}
@Chiara 当我尝试将 DynamoDB“列表”数据类型导入到 Quicksight 时遇到问题,数据源是 S3,
详细说明:
在 QuickSight 创建报告的过程中,我们遇到了从 DynamoDB 源导入数据的特定问题。导入后,QuickSight 数据集中有一个数据类型为“列表”的特定列始终会被删除。此行为表明 QuickSight 在数据导入过程中不处理来自 DynamoDB 的“列表”数据类型。
影响:
此“列表”栏中的数据对于我们的报告和分析至关重要。由于无法将此专栏包含在我们的 QuickSight 报告中,严重限制了我们可以向利益相关者提供的见解,因此影响了我们的业务分析能力。
已执行的故障排除:
验证了 DynamoDB 中数据的完整性和可访问性。
检查了有关 DynamoDB 中“列表”数据类型限制的任何 QuickSight 文档(未找到明确的文档)。
尝试在 QuickSight 中重新导入数据并重新创建数据源。
在 AWS 论坛和 QuickSight 用户社区中搜索类似问题或解决方案。
要求:
我们需要有关如何成功将具有“列表”数据类型的列从 DynamoDB 导入 QuickSight 的指导,或者需要一种解决方法来确保不跳过此数据。如果这是 QuickSight 中的限制,我们将不胜感激有关出于报告目的处理此类数据类型的最佳实践的建议。