在putHDFS之后重命名文件

时间:2018-09-20 14:46:49

标签: hdfs apache-nifi

我有一个Apache NIFI作业,我使用getFile从系统中获取文件,然后使用putHDFS,将文件放入hadoop之后如何在HDFS中重命名文件? 我尝试使用executeScript处理器,但无法正常工作

flowFile = session.get()
if flowFile != None:
    tempFileName= flowFile.getAttribute("filename")
    fileName=tempFileName.replace('._COPYING_','')
    flowFile = session.putAttribute(flowFile, 'filename', fileName)
    session.transfer(flowFile, REL_SUCCESS)

2 个答案:

答案 0 :(得分:2)

Shu的以上回答对于如何在NiFi中处理文件名属性是正确的,但是如果您已经将文件写入HDFS,然后使用UpdateAttribute,则它不会更改HDFS中的文件名,只会更改NiFi中的filename属性的值。

您可以使用UpdateAttribute方法创建一个名为“ final.filename”的新属性,然后使用MoveHDFS将原始文件移至最终文件。

还要注意,PutHDFS处理器已经写入了一个临时文件并将其移至最终文件,因此我不确定是否需要命名为“。 COPYING ”。例如,如果将流文件发送到文件名为“ foo”的PutHDFS,它将首先将“ .foo”写入目录,完成后会将其移动到“ foo”。

唯一需要使用MoveHDFS的情况是,如果其他进程正在监视目录并且不能忽略点文件,则将其写入其他位置,并在完成后使用MoveHDFS。

答案 1 :(得分:0)

代替使用 ExecuteScript 处理器(额外的开销),使用 UpdateAttribute 处理器从PutHDFS馈送成功关系

在UpdateAttribute处理器中将新属性添加为

文件名

import * as React from 'react';
import { Alert, TouchableOpacity, Text, View, StyleSheet } from 'react-native';
import { Constants } from 'expo';

export default class App extends React.Component {
  _onPressButton (n) {
    Alert.alert('You tapped the button number ' + n);
  }

  _renderBlockLebel = number => {
    var items = [];
    for (var i = 0; i < number; i++) {
      const n = i;
      items.push(
        <TouchableOpacity onPress={() => this._onPressButton(n)} key={i}>
          <View style={styles.boxItem}>
            <Text>Level {i}</Text>
          </View>
        </TouchableOpacity>
      );
    }
    return items;
  };

  render() {
    return (
      <View style={styles.container}>
        <View style={styles.box}>{this._renderBlockLebel(18)}</View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
  },
});

使用NiFi表达式语言中的replaceAll功能。

(或)

使用replace函数

文件名

${filename:replaceAll('<regex_expression>','<replacement_value>')}

enter image description here

NiFi表达式语言提供了不同的功能来操纵字符串,有关更多与表达式语言有关的文档,请参考this链接。

我曾尝试使用与 ExecuteScript 处理器和 Script Engine as Python 相同的确切脚本,并且一切正常。

使用${filename:replaceAll('<search_string>','<replacement_value>')} 函数并替换为.replace

输出:

enter image description here

文件名''更改为fn._COPYING_