Flink创建数据源的各种方式--Java和scala实现

      在上一篇博客<各种大数据框架处理流程>,我们可以知道:大数据中流行的各种计算框架都是从数据输入–>转换–>输出。数据输入的方式有多种,这篇博客就来介绍一下Flink创建数据源,也就是输入的各种方式。
      以下内容,均参考自Flink官网,如有不懂的可直接读官方文档 https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/batch/#data-sources
      主要有以下几种方式:

  • 读文件(包括本地文件和HDFS文件)
    * text文件
    * csv文件
    * 压缩文件
    * 递归地读文件夹
  • 从集合 (Java和scala中的集合)
    这两种方式又有不同的变化,比如读文件又可以读普通的text文件,csv文件或者压缩文件。

scala API

package ylqdh.bigdata.flink.test

import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.configuration.Configuration

/**
  * @Author ylqdh
  * @Date 2020/1/13 14:41
  *  Scala api 方式创建数据集
  */
object DataSourceApp {
  def main(args: Array[String]): Unit = {
    val env = ExecutionEnvironment.getExecutionEnvironment

//    fromCollection(env)
    textFile(env)
//    fromCSV(env)
//    RecuDir(env)
  }

  // 从text文件创建数据集,压缩文件也可以直接读
  // 支持的压缩格式有:deflate,gz,gzip,bz2,xz
  def textFile(env:ExecutionEnvironment): Unit = {
    val filePath = "file:///C:\\data\\scalaCode\\HelloWorld.gz"   // 路径可以指定到文件名,也可以是文件夹,但文件夹下还有文件夹就读不到了
    env.readTextFile(filePath).print()
  }

  // 递归地读文件夹里的文件
  def RecuDir(env:ExecutionEnvironment): Unit = {
    val filePath = "file:///C:\\data\\cleandata" // 这个文件夹里还有文件夹
    val parameter = new Configuration()
    parameter.setBoolean("recursive.file.enumeration",true)
    env.readTextFile(filePath).withParameters(parameter).print()
  }

  // 从csv文件读,来创建数据集
  def fromCSV(env:ExecutionEnvironment): Unit = {
    val filePath = "file:///C:\\data\\person.csv"

    import org.apache.flink.api.scala._

//     读csv文件,忽略文件的第一行
//    env.readCsvFile[(String, Int, String)](filePath,ignoreFirstLine = true).print()

//    只要csv的部分列
//    env.readCsvFile[(String, Int)](filePath,ignoreFirstLine = true,includedFields = Array(0,1)).print()

//   case class 方式
//    env.readCsvFile[person](filePath,ignoreFirstLine = true).print()

//    POJO 方式
    env.readCsvFile[PersonPOJO](filePath,ignoreFirstLine = true,pojoFields = Array("name","age","level")).print()
  }


  // 从collection创建数据集
  def fromCollection(env:ExecutionEnvironment): Unit = {

    import org.apache.flink.api.scala._
    val data = 1 to 10
    env.fromCollection(data).print()
  }

}
case class person(name:String,age:Int,level:String)

Java API

和scala API一样都是创建数据集,只不过用Java实现

package ylqdh.bigdata.flink.test;

import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.io.CsvReader;
import org.apache.flink.configuration.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName JavaDataSourceApp
 * @Description TODO java api 各种创建数据集的方式
 * @Author ylqdh
 * @Date 2020/1/13 14:59
 */
public class JavaDataSourceApp {
    public static void main(String[] args) {

        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

//     fromCollection(env);
//        readFile(env);
//        readCSV(env);
        readRecuDir(env);
    }

//  读text文件创建数据集,也可以是压缩文件
    public static void readFile(ExecutionEnvironment environment) {
        String filePath = "file:///C:\\data\\scalaCode\\HelloWorld.gz";

        try {
            environment.readTextFile(filePath).print();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//  递归的从文件夹下的所有文件
    public static void readRecuDir (ExecutionEnvironment environment) {
        String filePath = "file:///C:\\data\\cleandata";

        Configuration parameter = new Configuration();
        parameter.setBoolean("recursive.file.enumeration",true);
        try {
            environment.readTextFile(filePath)
                    .withParameters(parameter)
                    .print();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//   读csv文件创建数据集
    public static void readCSV(ExecutionEnvironment environment) {
        String filePath = "file:///C:\\data\\person.csv";

        DataSet<PersonPOJO> csvPojo = environment.readCsvFile(filePath)
                .ignoreFirstLine()
                .pojoType(PersonPOJO.class,"name","age","level");
        try {
            csvPojo.print();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    // 集合方式创建
    public static void fromCollection(ExecutionEnvironment environment) {
        List list = new ArrayList();
        for (int i=0;i<10;i++) {
            list.add(i);
        }

        try {
            environment.fromCollection(list).print();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

知道了Flink中Java和scala创建数据源的方式,接下来就可以对数据源做各种转换了,这也是大数据处理中的重中之重。接下来会更新Flink中的各种算子操作,尽请期待。

你可能感兴趣的:(BigData)