Jdbc 配置单元宏/UDF-并行/组合/单个解释器

Jdbc 配置单元宏/UDF-并行/组合/单个解释器,jdbc,parallel-processing,hive,udf,hcatalog,Jdbc,Parallel Processing,Hive,Udf,Hcatalog,我想创建一个配置单元扩展(宏/UDF/gateway/proxy/facade或其他),它可以 a) 创建/修改数据库表和 b) 处理数据。 这里的问题是,对于b)作为UDF的常见做法,需要并行处理,而对于a)则必须防止并行处理,例如,因为我不能将同一列多次添加到表中。在外部接口上,该解决方案应与SAS、SAP、R、Pentaho的配置单元连接器保持兼容,即它的行为和可用性应与配置单元相同 您建议如何实现DB create/modify语句的执行,而不会因为并行执行UDF而导致重复HQL命令出错

我想创建一个配置单元扩展(宏/UDF/gateway/proxy/facade或其他),它可以

a) 创建/修改数据库表和 b) 处理数据。 这里的问题是,对于b)作为UDF的常见做法,需要并行处理,而对于a)则必须防止并行处理,例如,因为我不能将同一列多次添加到表中。在外部接口上,该解决方案应与SAS、SAP、R、Pentaho的配置单元连接器保持兼容,即它的行为和可用性应与配置单元相同

您建议如何实现DB create/modify语句的执行,而不会因为并行执行UDF而导致重复HQL命令出错

我的想法是:

1.使用JDBC包装器来处理a)如本文所述,UDF用于b),问题:需要额外编程,(客户端/服务器端)安装和配置:http://stackoverflow.com/questions/8293314/is-there-any-lightweight-jdbc-wrapper-with-these-features, https://www.redfin.com/blog/2011/03/boilerplate_jdbc_wrapper.html, http://www.javaworld.com/article/2074249/data-storage/create-your-own-type-3-jdbc-driver--part-1.html, http://jdbc.jcabi.com/ 2.带有UDFs+挂接到配置单元解析器的配置单元。在钩子内部,HQL只执行一次:问题:非常复杂,需要更改配置单元设置(可能不可接受):http://stackoverflow.com/questions/17461932/hive-execution-hook 3.带有宏的蜂巢。问题:似乎不完全成熟、受限(主要是数字?)且记录不完整。 4.带有UDFs+显式组合器RESTful服务+JDBC/Beeline/HCatalog作为配置单元命令API的配置单元。问题:SPoF(单点故障)。 5.基于UDFs+配置单元组合器的配置单元实现。问题:不可能或非常复杂:http://stackoverflow.com/questions/10925840/partial-aggregation-vs-combiners-which-one-faster 6.使用汇总/合并方法,如UDAFs末尾所述:问题:没有很好的记录,可能不可行:http://www.dataiku.com/blog/2013/05/01/a-complete-guide-to-writing-hive-udf.html 7.从GenericUDAFEvaluator派生并实现merge,以便在单独的表中只创建一次所需的SQL语句。其他一些机制(如配置单元宏)可以执行此表中累积的命令。问题:复杂的实现和配置单元宏的问题。 8.使用/扩展配置单元网关实现,如Knox网关服务配置单元:http://repo1.maven.org/maven2/org/apache/knox/gateway-service-hive/0.8.0/ 问题:太特殊了。在大多数情况下,通用JDBC包装器是更好的基础。 不够:

9在支持HQL语句的语句中添加“IF NOT EXISTS”。还有其他机制,如http://stackoverflow.com/questions/14381895/mysql-add-column-if-not-exist, http://stackoverflow.com/questions/972922/add-column-to-mysql-table-if-it-does-not-exist 10这个https://github.com/jwills/exhibit GitHub上的UDF不够充分,但很有趣。 11getExistingHiveConnection()会混淆配置单元解析器;getNewHiveConnection()也不能解决HQL结构化命令不必要的并行执行导致错误的问题。 我注意到在UDF中创建另一个到配置单元的连接会导致配置单元解析器的混乱,这是可以理解的。然而,在一个复杂的UDF中,我也注意到在这个上下文中,第二个.toString()不再工作了,为什么

公共对象求值(GenericUDF.DeferreObject[]ParamarrayOfDeferreObject){…
对于(int i=0;i
后来:

String tableName=paramObjectArr[0].toString();//不工作,分配了空字符串,为什么?

@Thomas_Poetter-您在这里提供了很多考虑因素,但我并不完全清楚您的实际用例是什么。例如,为什么不完全拆分1和2,直接对HS2执行结构化任务,并将处理放在UDF中

Oozie还可以提供一些有趣的工作流功能,以保持此单独但作为单个工作流执行


请注意,Knox只是一个用于JDBC/ODBC调用HS2的流式网关。为此扩展它没有多大意义。但是,您可以提供一个简单的自定义服务来公开Knox可以代理的API。如果您需要独立于某些外部应用程序执行任务,那么这可能很有用。

用例是为最终客户提供统一的API,理想情况下是SQL/HQL语句,允许在一次运行中插入企业内存或其他高度结构化数据库的结构和数据。使用HiveServer2和JDBC将其分为两个阶段是一个有效的想法,但客户需要使用两个API或一个复杂的API将内部2个API同步为单个外部API的机制是必要的。