我有一个StreamSets管道,我在其中使用JDBC组件作为源从远程SQL Server数据库中读取数据,并将数据放入Hive和Kudu数据湖中。
我在使用Binary Columns类型时遇到了一些问题,因为Impala中没有Binary类型支持,我用来访问Hive和Kudu。
我决定将Binary类型的列(在管道中以Byte_Array类型流动)转换为String并像这样插入。
我尝试使用Field Type Converter元素将所有Byte_Array类型转换为String,但是没有用。因此,我使用了Jython组件将所有arr.arr类型转换为String。它工作正常,直到在该字段上获得Null值为止,所以Jython类型为None.type,并且我无法检测到Byte_Array类型并将其转换为String。所以我无法将其插入Kudu。
是否有任何帮助如何在Jython Evaluator中获取StreamSets记录字段类型?或针对我所遇到的问题提出任何建议的解决方法?
答案 0 :(得分:1)
这是我的最终解决方案:
您可以使用NULL_CONSTANTS,使用以下逻辑来检测Jython组件内的任何StreamSet类型:
NULL_BOOLEAN, NULL_CHAR, NULL_BYTE, NULL_SHORT, NULL_INTEGER, NULL_LONG,
NULL_FLOAT, NULL_DOUBLE, NULL_DATE, NULL_DATETIME, NULL_TIME, NULL_DECIMAL,
NULL_BYTE_ARRAY, NULL_STRING, NULL_LIST, NULL_MAP
这个想法是将字段的值保存在temp变量中,将该字段的值设置为None,并使用功能 sdcFunctions.getFieldNull ,通过将其与NULL_CONSTANTS之一。
import binascii def toByteArrayToHexString(value): if value is None: return NULL_STRING value = '0x'+binascii.hexlify(value).upper() return value for record in records: try: for colName,value in record.value.items(): temp = record.value[colName] record.value[colName] = None if sdcFunctions.getFieldNull(record,'/'+colName) is NULL_BYTE_ARRAY: temp = toByteArrayToHexString(temp) record.value[colName] = temp output.write(record) except Exception as e error.write(record, str(e))