spark和flink读取csv文件对比

最近总是会有需求要涉及到读取csv文件,以前总是拿到文件就去读,没有仔细去看相关的方法和功能,现在结合最近的需求,记录一下spark和flink读取csv文件的操作。
(注:本文内容针对spark2.3.0以及flink1.9.1)

spark:

本来想自己总结一下,但是这里有位大佬写的很详细,可以直接参考:
https://blog.csdn.net/weixin_42411818/article/details/98734464
举个简单的小例子,现在我们有这样一份csv文件
在这里插入图片描述
我们只想读uuid和phone这一列,并且读的时候不想要这个列名,该如何操作呢?
首先我们要在csv文件调整一下列的顺序让uuid和phone在最前面的两列,如下:
在这里插入图片描述
然后:

	import org.apache.spark.sql.types._
    val schema = new StructType().add("uuid", StringType).add("phone", StringType)
    sparkSession.read.option("header", true).schema(schema).csv(localpath)

(关于option和schema等相关功能解释请看上面的链接)

这里我们要解释一下我们为什么要这么操作呢?是因为spark读取csv有几个注意点:

  • csv会完全按照指定的schema结构进行转换,若不指定schema默认都解析为StringType(若指定了option(“inferSchema”,true)会遍历数据推断类型)。
  • 列的顺序和指定schema中列的顺序是一致的,这点不像json,json会进行列名对应,但是csv不会,只会根据顺序判断(即使指定了option(“header”,true)也无效,会将header中列名进行覆盖)。
  • 若schema列数多于原始数据列数,schema最后面多出的列会为null。
  • 若schema列数少于原始数据列数,只会取原始数据中前面的列,原始数据多出的列的数据将被忽略

flink:

flink的读取方法较spark就显的不那么混乱了,还是上面一样的csv文件,我们还是读取uuid和phone列:

env.readCsvFile[(String,String)](path,ignoreFirstLine=true,includedFields=Array(0,6))

这样就可以了,我们可以用数组指定读取csv的列。
readCsvFile方法的全部功能如下:

def readCsvFile[T : ClassTag : TypeInformation](
      filePath: String,
      lineDelimiter: String = "\n",
      fieldDelimiter: String = ",",
      quoteCharacter: Character = null,
      ignoreFirstLine: Boolean = false,
      ignoreComments: String = null,
      lenient: Boolean = false,
      includedFields: Array[Int] = null,
      pojoFields: Array[String] = null): DataSet[T] = {...}

filePath:文件的路径 lineDelimiter分隔行的字符串,默认为换行符。
fieldDelimiter:分隔各个字段的字符串,默认为“,”。
quoteCharacter:用于加引号的字符串解析的字符,默认情况下禁用。
ignoreFirstLine:是否应该忽略文件中的第一行。
ignoreComments:以给定String开头的行将被忽略,默认情况下处于禁用状态。
lenient:解析器是否应静默忽略格式错误的行。
includedFields:文件中应读取的字段。默认情况下,所有字段*均被读取。
pojoFields :POJO的字段已映射到CSV字段。

可以看出flink读csv的姿势,还是比spark更舒服一点~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值