如何在Jython Evaluator中获取StreamSets记录字段类型

时间:2019-07-23 16:42:36

标签: hive bigdata jython kudu streamsets

我有一个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记录字段类型?或针对我所遇到的问题提出任何建议的解决方法?

1 个答案:

答案 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))