This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 686e48f2684 [Enhencement](tvf) select tvf supports using resource (#35139) 686e48f2684 is described below commit 686e48f26841e418a229987a3bffb8992c9bb16e Author: Tiewei Fang <43782773+bepppo...@users.noreply.github.com> AuthorDate: Fri May 24 12:05:52 2024 +0800 [Enhencement](tvf) select tvf supports using resource (#35139) Create an S3/HDFS resource that TVF can use it directly to access the data source. --- .../ExternalFileTableValuedFunction.java | 12 +++- .../tvf/test_s3_tvf_with_resource.out | 70 ++++++++++++++++++++++ .../external_table_p0/tvf/test_s3_tvf.groovy | 4 -- ...tvf.groovy => test_s3_tvf_with_resource.groovy} | 64 ++++++++++---------- 4 files changed, 114 insertions(+), 36 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java index d692e6c9d30..10c57f68655 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java @@ -26,6 +26,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.catalog.HdfsResource; import org.apache.doris.catalog.MapType; import org.apache.doris.catalog.PrimitiveType; +import org.apache.doris.catalog.Resource; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.StructField; import org.apache.doris.catalog.StructType; @@ -174,9 +175,18 @@ public abstract class ExternalFileTableValuedFunction extends TableValuedFunctio //The keys in properties map need to be lowercase. protected Map<String, String> parseCommonProperties(Map<String, String> properties) throws AnalysisException { + Map<String, String> mergedProperties = Maps.newHashMap(); + if (properties.containsKey("resource")) { + Resource resource = Env.getCurrentEnv().getResourceMgr().getResource(properties.get("resource")); + if (resource == null) { + throw new AnalysisException("Can not find resource: " + properties.get("resource")); + } + mergedProperties = resource.getCopiedProperties(); + } + mergedProperties.putAll(properties); // Copy the properties, because we will remove the key from properties. Map<String, String> copiedProps = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); - copiedProps.putAll(properties); + copiedProps.putAll(mergedProperties); String formatString = getOrDefaultAndRemove(copiedProps, FileFormatConstants.PROP_FORMAT, "").toLowerCase(); String defaultColumnSeparator = FileFormatConstants.DEFAULT_COLUMN_SEPARATOR; diff --git a/regression-test/data/external_table_p0/tvf/test_s3_tvf_with_resource.out b/regression-test/data/external_table_p0/tvf/test_s3_tvf_with_resource.out new file mode 100644 index 00000000000..e7ed7f6af85 --- /dev/null +++ b/regression-test/data/external_table_p0/tvf/test_s3_tvf_with_resource.out @@ -0,0 +1,70 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_base -- +1 doris1 18 +2 doris2 19 +3 doris3 99 +4 doris4 \N +5 doris5 15 + +-- !select_1 -- +1 doris1 18 +2 doris2 19 +3 doris3 99 +4 doris4 \N +5 doris5 15 + +-- !select_2 -- +1 doris1 18 +2 doris2 19 +3 doris3 99 +4 doris4 \N +5 doris5 15 + +-- !select_3 -- +1 doris1 18 +2 doris2 19 +3 doris3 99 +4 doris4 \N +5 doris5 15 + +-- !select_4 -- +12 abcdef 1.23 +12313 kkkkkk 5.77 +123456 abcdef 1.2 +126 abcdef 1.25 +13 abcdef 1.24 +156 ahef 1.26 +323456 oooodef 1.27 +5456 abadsasf 1.28 +723456 text 1.3 +823456 hive 1.32 +923456 helloworld 1.89 + +-- !select_5 -- +12 abcdef 1.23 +12313 kkkkkk 5.77 +123456 abcdef 1.2 +126 abcdef 1.25 +13 abcdef 1.24 +156 ahef 1.26 +323456 oooodef 1.27 +5456 abadsasf 1.28 +723456 text 1.3 +823456 hive 1.32 +923456 helloworld 1.89 + +-- !select_6 -- +12313 kkkkkk 5.77 +923456 helloworld 1.89 + +-- !select_7 -- +12313 kkkkkk 5.77 +123456 abcdef 1.2 +126 abcdef 1.25 +156 ahef 1.26 +323456 oooodef 1.27 +5456 abadsasf 1.28 +723456 text 1.3 +823456 hive 1.32 +923456 helloworld 1.89 + diff --git a/regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy b/regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy index 4f09680ba53..24dda4196d7 100644 --- a/regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy +++ b/regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy @@ -124,7 +124,6 @@ suite("test_s3_tvf", "p0") { "s3.access_key"= "${ak}", "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", "region" = "${region}" ) order by c1,c2,c3; """ @@ -137,7 +136,6 @@ suite("test_s3_tvf", "p0") { "s3.access_key"= "${ak}", "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", "region" = "${region}", "csv_schema"="k1:int;k2:string;k3:double" ) order by k1,k2,k3; @@ -151,7 +149,6 @@ suite("test_s3_tvf", "p0") { "s3.access_key"= "${ak}", "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", "region" = "${region}", "csv_schema"="k1:int;k2:string;k3:double" ) where k3 > 1.5 order by k3,k2,k1; @@ -165,7 +162,6 @@ suite("test_s3_tvf", "p0") { "s3.access_key"= "${ak}", "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", "region" = "${region}", "csv_schema"="k1:int;k2:string;k3:double" ) where k1 > 100 order by k3,k2,k1; diff --git a/regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy b/regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy similarity index 78% copy from regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy copy to regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy index 4f09680ba53..0f5f43ccb8e 100644 --- a/regression-test/suites/external_table_p0/tvf/test_s3_tvf.groovy +++ b/regression-test/suites/external_table_p0/tvf/test_s3_tvf_with_resource.groovy @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -suite("test_s3_tvf", "p0") { +suite("test_s3_tvf_with_resource", "p0") { // open nereids sql """ set enable_nereids_planner=true """ sql """ set enable_fallback_to_original_planner=false """ @@ -27,8 +27,9 @@ suite("test_s3_tvf", "p0") { String bucket = context.config.otherConfigs.get("s3BucketName"); - def export_table_name = "test_s3_tvf_export_test" + def export_table_name = "test_s3_tvf_with_resource_export_test" def outFilePath = "${bucket}/est_s3_tvf/export_test/exp_" + def resource_name = "test_s3_tvf_resource" def create_table = {table_name -> @@ -43,6 +44,22 @@ suite("test_s3_tvf", "p0") { """ } + def create_s3_resource = { + sql """ DROP RESOURCE IF EXISTS '${resource_name}' """ + sql """ + CREATE RESOURCE "${resource_name}" + PROPERTIES + ( + "type" = "s3", + "s3.endpoint" = "${s3_endpoint}", + "s3.region" = "${region}", + "s3.access_key"= "${ak}", + "s3.secret_key" = "${sk}", + "s3.bucket" = "${bucket}" + ); + """ + } + def outfile_to_S3 = { // select ... into outfile ... def res = sql """ @@ -63,6 +80,9 @@ suite("test_s3_tvf", "p0") { // create table to export data create_table(export_table_name) + // create s3 resource + create_s3_resource() + // insert data sql """ insert into ${export_table_name} values (1, 'doris1', 18); """ sql """ insert into ${export_table_name} values (2, 'doris2', 19); """ @@ -80,10 +100,9 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_1 """ SELECT * FROM S3 ( "uri" = "http://${s3_endpoint}${outfile_url.substring(4, outfile_url.length() - 1)}0.orc", - "ACCESS_KEY"= "${ak}", - "SECRET_KEY" = "${sk}", "format" = "orc", - "region" = "${region}" + "use_path_style" = "true", + "resource" = "${resource_name}" ); """ } finally { @@ -94,11 +113,8 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_2 """ SELECT * FROM S3 ( "uri" = "http://${outfile_url.substring(5)}0.orc", - "s3.access_key"= "${ak}", - "s3.secret_key" = "${sk}", - "s3.endpoint" = "${s3_endpoint}", "format" = "orc", - "region" = "${region}" + "resource" = "${resource_name}" ); """ } finally { @@ -108,11 +124,9 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_3 """ SELECT * FROM S3 ( "uri" = "http://${s3_endpoint}${outfile_url.substring(4, outfile_url.length() - 1)}0.orc", - "s3.access_key"= "${ak}", - "s3.secret_key" = "${sk}", "format" = "orc", "use_path_style" = "true", - "region" = "${region}" + "resource" = "${resource_name}" ); """ } finally { @@ -121,11 +135,8 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_4 """ SELECT * FROM S3 ( "uri" = "https://${bucket}.${s3_endpoint}/regression/tvf/test_hive_text.text", - "s3.access_key"= "${ak}", - "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", - "region" = "${region}" + "resource" = "${resource_name}" ) order by c1,c2,c3; """ } finally { @@ -134,12 +145,9 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_5 """ SELECT * FROM S3 ( "uri" = "https://${bucket}.${s3_endpoint}/regression/tvf/test_hive_text.text", - "s3.access_key"= "${ak}", - "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", - "region" = "${region}", - "csv_schema"="k1:int;k2:string;k3:double" + "csv_schema"="k1:int;k2:string;k3:double", + "resource" = "${resource_name}" ) order by k1,k2,k3; """ } finally { @@ -148,12 +156,9 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_6 """ SELECT * FROM S3 ( "uri" = "https://${bucket}.${s3_endpoint}/regression/tvf/test_hive_text.text", - "s3.access_key"= "${ak}", - "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", - "region" = "${region}", - "csv_schema"="k1:int;k2:string;k3:double" + "csv_schema"="k1:int;k2:string;k3:double", + "resource" = "${resource_name}" ) where k3 > 1.5 order by k3,k2,k1; """ } finally { @@ -162,12 +167,9 @@ suite("test_s3_tvf", "p0") { try { order_qt_select_7 """ SELECT * FROM S3 ( "uri" = "https://${bucket}.${s3_endpoint}/regression/tvf/test_hive_text.text", - "s3.access_key"= "${ak}", - "s3.secret_key" = "${sk}", "format" = "hive_text", - "use_path_style" = "true", - "region" = "${region}", - "csv_schema"="k1:int;k2:string;k3:double" + "csv_schema"="k1:int;k2:string;k3:double", + "resource" = "${resource_name}" ) where k1 > 100 order by k3,k2,k1; """ } finally { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org