use of org.apache.flink.table.sinks.StreamTableSink in project flink by apache.
the class HiveTableFactoryTest method testGenericTable.
@Test
public void testGenericTable() throws Exception {
final TableSchema schema = TableSchema.builder().field("name", DataTypes.STRING()).field("age", DataTypes.INT()).build();
catalog.createDatabase("mydb", new CatalogDatabaseImpl(new HashMap<>(), ""), true);
final Map<String, String> options = Collections.singletonMap(FactoryUtil.CONNECTOR.key(), "COLLECTION");
final CatalogTable table = new CatalogTableImpl(schema, options, "csv table");
catalog.createTable(new ObjectPath("mydb", "mytable"), table, true);
final Optional<TableFactory> tableFactoryOpt = catalog.getTableFactory();
assertTrue(tableFactoryOpt.isPresent());
final HiveTableFactory tableFactory = (HiveTableFactory) tableFactoryOpt.get();
final TableSource tableSource = tableFactory.createTableSource(new TableSourceFactoryContextImpl(ObjectIdentifier.of("mycatalog", "mydb", "mytable"), table, new Configuration(), false));
assertTrue(tableSource instanceof StreamTableSource);
final TableSink tableSink = tableFactory.createTableSink(new TableSinkFactoryContextImpl(ObjectIdentifier.of("mycatalog", "mydb", "mytable"), table, new Configuration(), true, false));
assertTrue(tableSink instanceof StreamTableSink);
}
use of org.apache.flink.table.sinks.StreamTableSink in project flink by apache.
the class CommonExecLegacySink method translateToPlanInternal.
@SuppressWarnings("unchecked")
@Override
protected Transformation<T> translateToPlanInternal(PlannerBase planner, ExecNodeConfig config) {
if (tableSink instanceof StreamTableSink) {
final Transformation<T> transform;
if (tableSink instanceof RetractStreamTableSink) {
transform = translateToTransformation(planner, config, true);
} else if (tableSink instanceof UpsertStreamTableSink) {
UpsertStreamTableSink<T> upsertSink = (UpsertStreamTableSink<T>) tableSink;
final boolean isAppendOnlyTable = !needRetraction;
upsertSink.setIsAppendOnly(isAppendOnlyTable);
if (upsertKeys != null) {
upsertSink.setKeyFields(upsertKeys);
} else {
if (isAppendOnlyTable) {
upsertSink.setKeyFields(null);
} else {
throw new TableException("UpsertStreamTableSink requires that Table has a full primary keys if it is updated.");
}
}
transform = translateToTransformation(planner, config, true);
} else if (tableSink instanceof AppendStreamTableSink) {
// verify table is an insert-only (append-only) table
if (needRetraction) {
throw new TableException("AppendStreamTableSink requires that Table has only insert changes.");
}
transform = translateToTransformation(planner, config, false);
} else {
if (isStreaming) {
throw new TableException("Stream Tables can only be emitted by AppendStreamTableSink, " + "RetractStreamTableSink, or UpsertStreamTableSink.");
} else {
transform = translateToTransformation(planner, config, false);
}
}
final DataStream<T> dataStream = new DataStream<T>(planner.getExecEnv(), transform);
final DataStreamSink<T> dsSink = (DataStreamSink<T>) ((StreamTableSink<T>) tableSink).consumeDataStream(dataStream);
if (dsSink == null) {
throw new TableException(String.format("The StreamTableSink#consumeDataStream(DataStream) must be implemented " + "and return the sink transformation DataStreamSink. " + "However, %s doesn't implement this method.", tableSink.getClass().getCanonicalName()));
}
return dsSink.getLegacyTransformation();
} else if (tableSink instanceof DataStreamTableSink) {
// is no real table sink, so we just need translate its input to Transformation.
return translateToTransformation(planner, config, ((DataStreamTableSink<T>) tableSink).withChangeFlag());
} else {
throw new TableException(String.format("Only Support StreamTableSink! However %s is not a StreamTableSink.", tableSink.getClass().getCanonicalName()));
}
}
Aggregations