将配置单元结果集转换为多字符分隔的csv-selecthiveql处理器nifi

ki1q1bka  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(245)

我正在尝试使用selecthiveql处理器从配置单元中获取包含10m+条记录的完整大表,但确实发现源代码中的converttocsvstream()方法比获取结果集花费的时间更长。观察代码:结果集被逐行迭代,然后被添加到输出流中。
当表的大小很小时,它会在几秒钟内完成这个过程,但是由于数据很大,它需要更长的时间。有没有办法优化转换??我试过用100000/1000/10000/1000的取数大小。
代码如下:

while (rs.next()) {
        //logger.info("+++++++++++++Inside the While loop+++++++++++++++++");
        if (callback != null) {
            callback.processRow(rs);
        }

        List<String> rowValues = new ArrayList<>(nrOfColumns);

        for (int i = 1; i <= nrOfColumns; i++) {
            final int javaSqlType = meta.getColumnType(i);
            final Object value = rs.getObject(i);

            //logger.info("+++++++++++++Entering the Switch at +++++++++++++++++");
            switch (javaSqlType) {

                case CHAR:
                case LONGNVARCHAR:
                case LONGVARCHAR:
                case NCHAR:
                case NVARCHAR:
                case VARCHAR:
                    String valueString = rs.getString(i);
                    if (valueString != null) {
                        // Removed extra quotes as those are a part of the escapeCsv when required.
                        StringBuilder sb = new StringBuilder();
                        if (outputOptions.isQuote()) {
                            sb.append("\"");
                            if (outputOptions.isEscape()) {
                                sb.append(StringEscapeUtils.escapeCsv(valueString));
                            } else {
                                sb.append(valueString);
                            }
                            sb.append("\"");
                            rowValues.add(sb.toString());
                        } else {
                            if (outputOptions.isEscape()) {
                                rowValues.add(StringEscapeUtils.escapeCsv(valueString));
                            } else {
                                rowValues.add(valueString);
                            }
                        }
                    } else {
                        rowValues.add("");
                    }
                    break;
                case ARRAY:
                case STRUCT:
                case JAVA_OBJECT:
                    String complexValueString = rs.getString(i);
                    if (complexValueString != null) {
                        rowValues.add(StringEscapeUtils.escapeCsv(complexValueString));
                    } else {
                        rowValues.add("");
                    }
                    break;
                default:
                    if (value != null) {
                        rowValues.add(value.toString());
                    } else {
                        rowValues.add("");
                    }
            }
            //logger.info("+++++++++++++Exiting the Switch at +++++++++++++++++" + System.currentTimeMillis());
        }

        // Write row values
        //logger.info("+++++++++++++Writing Row value at+++++++++++++++++" + System.currentTimeMillis());
        outStream.write(StringUtils.join(rowValues, outputOptions.getDelimiter()).getBytes(StandardCharsets.UTF_8));
        outStream.write("\n".getBytes(StandardCharsets.UTF_8));
        nrOfRows++;

        if (maxRows > 0 && nrOfRows == maxRows)
            break;
    }
4jb9z9bj

4jb9z9bj1#

对selecthiveql的csv输出的改进在nifi-5307中有介绍,但尚未实现。也有讨论(但据我所知没有jira)允许增量提交(即在处理部分结果后立即发送,而不是在完全处理结果集后发送所有结果),如querydatabasetable(nifi-4836)中所做的。

相关问题