【spark数据处理】文件上传+文件读取+文件筛选

本文详细介绍了HadoopHDFS的常用命令,包括文件上传、修改文件名、多文件合并以及如何使用SparkDataFrame进行数据读取、处理和展示,涉及Text、Json、Sequence和Object文件格式,以及DataFrame的select、where、filter、groupBy等操作。
摘要由CSDN通过智能技术生成

环境介绍(hadoop、spark、jdk)

HDFS常用命令:
hadoop fs & hdfs dfs
注:path 为路径 src为文件路径 dist 为文件夹
-help[cmd] 显示命令的帮助信息
-ls(r) 显示当前目录下的所有文件 -R层层循出文件夹
-du(s) 显示目录中所有文件大小
-count[-q] 显示当前目录下的所有文件大小
-mv 移动多个文件目录到目标目录
-cp 复制多个文件到目标目录
-rm(r) 删除文件(夹)
-put 本地文件复制到hdfs
-copyFromLocal 本地文件复制到hdfs
-moveFromLocal 本地文件移动到hdfs
-get[-ignoreCrc] 复制文件到本地,可以忽略crc校验
-getmerge 将源目录中的所有文件排序合并到一个文件中
-appendToFile 将内容追加到指定文档中
-cat 在终端显示文件内容
-text 在终端显示文件内容
-copyToLocal[-ignoreCrc] 复制文件到本地
-moveToLocal 移动文件到本地
-mkdir 创建文件夹 后跟-p 可以创建不存在的父路径
-touchz 创建一个空文件

一、文件上传

hdfs上传:

hadoop fs -mkdir -p /data  //创建目录

hadoop fs -put /data/wenjian1.csv /data   //上传文件

(hadoop fs或者hdfs dfs上传都可以,命令区别不大)

二、修改文件名(根据自身情况而定)

这边建议有中文名的都改为英文名,有特殊字符的都改成标准的格式,以免后续报错

下面假设我们上传的文件名称为(文件1.csv)

hadoop fs -mv /data/文件1.csv /data/wenjian1.csv

三、多文件合并

(1)该命令为data1文件和data2文件末尾追加到data3.csv文件中,做到多文件合并成一个新的文件

hadoop fs  -appendToFile /data/data1.csv /data/data2.csv /data/data3.csv

(2)在这个例子中,file1.txt 的内容会首先出现在 merged_data.txt 中,然后是 file2.txt 的内容,最后是 file3.txt 的内容。达成合并文件目的

hdfs dfs -getmerge /user/data/file1.txt /user/data/file2.txt /user/data/file3.txt merged_data.txt

 四、读取文件

  1. Text文件:这是最基本的文件格式,Spark可以通过sc.textFile("path")来读取Text文件,并且可以使用saveAsTextFile(path)将RDD保存为Text文件。
  2. Json文件:对于Json文件,Spark提供了多种方式来读取和解析,例如使用SparkSQL或第三方库如fastjson。读取Json文件时,通常需要解析其Json格式。
  3. Sequence文件:这是针对key-value类型RDD的文件格式。可以通过sc.sequenceFile[KeyClass, ValueClass]("path")来读取,并可以创建RDD保存为Sequence文件。
  4. Object文件:可以将pairRDD保存为Object文件,并使用sc.objectFile[KeyClass, ValueClass]("path")来读取
  5. Csv文件:可以用spark.read.csv()来实现读取

val df = spark.read.option("header", "true").option("sep", ",").csv("/data/wenjian1.csv")

  1. val df =:这是Scala中的声明变量的方式。这里声明了一个名为df的变量,它将被赋予一个DataFrame类型的值。
  2. spark.readspark是一个SparkSession的实例,它是Spark所有功能的入口点。read方法用于从外部数据源读取数据。
  3. .option("header", "true"):这是为读取操作设置的一个选项。header选项指定CSV文件的第一行是否包含列名。在这个例子中,我们设置header"true",意味着CSV文件的第一行是列名,并且这些列名将作为DataFrame的列名。
  4. .option("sep", ","):这也是为读取操作设置的一个选项。sep选项指定字段之间的分隔符。在这个例子中,我们设置分隔符为逗号(,),这是CSV文件的标准分隔符。
  5. .csv("/data/wenjian1.csv"):这指定了要读取的CSV文件的路径。在这个例子中,文件位于/data/目录下,名为wenjian1.csv

五、显示数据

show()显示语句

df.show(5)显示前五行数据 

六、处理数据

常用语句

select 选择 :可以选择指定行,指定类,并且可以重名

where 筛选 :给筛选的列值等于给定值的行

filter 筛选:可以对数据进行筛选

groupby 分组:对数据进行分组

distinct 去重 :对重复数据进行清洗

select:

对“学校”列进行去重:

val uniquewenjian = df.select("学校").distinct()

选择指定列

val df1 = df.select("columnName1", "columnName2")

选择指定列,并重命名

val df1 =df.select($"columnName",$"columnName")

where:

 筛选指定列值等于给定值的行

val df1= df.where("columnName = 'value'")

fitter:

筛选列值大于 5的行

val df1 = df.filter("columnName > 5")  

groupBy():

按指定列分组,并对每组 进行聚合计数

 val df1 = df.groupBy("columnName").agg(count("columnName")) 

对多列进行分组,并对每组进行聚合计数,这段代码首先创建了一个SparkSession实例,然后创建了一个包含三列("columnName1", "columnName2", "col")的DataFrame。之后,使用groupBy方法按照"columnName1"和"columnName2"进行分组,然后调用agg方法进行聚合,并使用mean函数计算"col"列的平均值,将结果列命名为"m"。最后,使用show方法打印出分组聚合后的结果。

val df1 = df.groupBy("columnName1", "columnName2").agg(mean("student").alias("s1"))

(补充)以下是一些常用的聚合函数及其在DataFrame中的应用:

  1. count(): 用于计算分组中的记录数。
  2. sum(): 计算分组中某列的总和。
  3. avg(): 计算分组中某列的平均值。
  4. max(): 获取分组中某列的最大值。
  5. min(): 获取分组中某列的最小值。
  6. collect_list() 和 collect_set(): 分别收集分组中某列的所有值到一个列表或集合中,去除重复项。
  7. first() 和 last(): 分别获取分组中某列的第一个和最后一个值。
  8. group_concat(): 连接分组中某列的所有值。注意,这不是Spark SQL的内置函数,但可以使用concat_ws函数达到类似的效果。
  9. approx_count_distinct(): 计算近似不同的值数,这对于大数据集来说通常比count(DISTINCT column)更快,但结果可能不是精确的。
val countDF = df.groupBy("columnName").agg(count("*").alias("count"))
val sumDF = df.groupBy("columnName").agg(sum("numericColumn").alias("sum"))
val avgDF = df.groupBy("columnName").agg(avg("numericColumn").alias("avg"))
val maxDF = df.groupBy("columnName").agg(max("numericColumn").alias("max"))
val minDF = df.groupBy("columnName").agg(min("numericColumn").alias("min"))
val listDF = df.groupBy("columnName").agg(collect_list("anotherColumn").alias("list"))  
val setDF = df.groupBy("columnName").agg(collect_set("anotherColumn").alias("set"))
val firstDF = df.groupBy("columnName").agg(first("anotherColumn").alias("firstValue"))  
val lastDF = df.groupBy("columnName").agg(last("anotherColumn").alias("lastValue"))
val concatDF = df.groupBy("columnName").agg(concat_ws(",", collect_list("anotherColumn")).alias("concatenated"))
val approxCountDF = df.groupBy("columnName").agg(approx_count_distinct("anotherColumn").alias("approxCount"))

distinct:

获取指定列的唯一值

df.select("columnName").distinct()

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Spark中的textFile函数可以用来读取文本文件。它可以接受一个文件路径作为参数,并返回一个RDD对象,其中每个元素都是文件中的一行文本。例如,以下代码可以读取一个名为“input.txt”的文本文件: val lines = sc.textFile("input.txt") 其中,sc是SparkContext对象,需要在程序中先创建。读取完成后,可以对RDD对象进行各种操作,例如过滤、映射、聚合等。 ### 回答2: Spark的TextFile方法是用于读取文本文件的函数。使用这个方法,我们可以轻松地从本地文件系统或分布式文件系统中读取文本文件,并将其转换为RDD。 在Spark中,我们可以使用TextFile方法来读取文本文件,这个方法接受一个参数,即文件的路径。文件的路径可以是本地文件系统的路径,也可以是分布式文件系统(如HDFS)的路径。 当我们调用TextFile方法时,Spark会将文本文件加载到集群中,并将其分成多个分区。每个分区都包含文件中的一部分数据,可以并行处理。分区的数量通常由文件的大小和集群的计算能力决定。 读取文本文件后,我们可以对RDD执行各种转换和操作,如筛选、映射、聚合等。这些操作可以通过RDD的各种转换函数来实现,如Filter、Map、Reduce等。 此外,我们还可以在读取文本文件时指定一些可选的参数,如文件的格式、编码方式等。例如,我们可以通过设置TextFile的第二个参数来指定文件的格式,如TextFile("file.txt", "com.databricks.spark.csv"),这样就可以读取CSV格式的文件。 总而言之,Spark的TextFile方法是一个非常方便的函数,可以帮助我们轻松地读取文本文件,并进行各种数据处理和分析。无论是在本地环境还是分布式环境中,TextFile都是一个非常常用的读取文件的方法。 ### 回答3: Spark的textFile函数是用来读取文本文件的。它支持读取本地文件系统,也可以读取分布式文件系统(如HDFS)中的文件。 textFile函数的用法如下: val rdd = sc.textFile("file:///path/to/file") 其中,sc是SparkContext对象,"file:///path/to/file"是要读取文件路径。如果是在本地文件系统中,则file://可以省略,直接写路径即可。 textFile函数会将文本文件读取为一个RDD(弹性分布式数据集)。每一行文本都会作为RDD中的一个元素,文件中的每一行都会作为RDD中的一个分区(partition)。如果文件很大,Spark会自动将文件进行切片并以分区的形式在集群中并行处理。 读取文件后,可以对RDD进行各种转换和操作。例如,可以使用map、filter、count等函数对每一行文本进行处理和统计。此外,还可以将多个文本文件合并为一个RDD,使用union函数来实现。 需要注意的是,textFile函数只是将文件读取为RDD,而不会对文件内容进行解析或解码。对于非文本文件(如二进制文件),需要自行根据文件格式进行解析和处理。 总之,通过Spark的textFile函数可以方便地读取文本文件,并在集群中进行并行处理和分析。同时,可以应用Spark丰富的操作和转换函数对文件内容进行处理和转换。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值