使用Spark将csv.gz文件转换为Parquet

时间:2015-10-21 23:15:37

标签: scala hadoop amazon-s3 apache-spark parquet

我需要使用Spark(Scala首选)将AWS S3和HDFS文件夹中的csv.gz文件转换为Parquet文件。其中一列数据是时间戳,我只有一周的数据集。时间戳格式为:

' yyyy-MM-dd hh:mm:ss'

我想要的输出是每天都有一个文件夹(或分区),其中包含该特定日期的Parquet文件。所以会有7个输出文件夹或分区。

我对如何做到这一点只有一个微弱的想法,只有sc.textFile在我的脑海里。 Spark中是否有可以转换为Parquet的功能?如何在S3和HDFS中实现此功能?

谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

如果您查看Spark Dataframe APISpark-CSV package,这将实现您尝试做的大部分工作 - 将CSV文件读入数据框,然后编写数据框因为镶木地板可以让你在那里大部分时间。

您仍然需要在解析时间戳和使用结果对数据进行分区时执行一些步骤。

答案 1 :(得分:0)

老话题,但是如果没有正确回答那就认为回答旧话题很重要。

火花版本中的

> = 2 csv包已经包含在您需要将databricks csv包导入您的作业之前,例如“--packages com.databricks:spark-csv_2.10:1.5.0”。

示例csv:

id,name,date
1,pete,2017-10-01 16:12
2,paul,2016-10-01 12:23
3,steve,2016-10-01 03:32
4,mary,2018-10-01 11:12 
5,ann,2018-10-02 22:12
6,rudy,2018-10-03 11:11
7,mike,2018-10-04 10:10

首先,您需要创建hivetable,以便spark写入的数据与hive架构兼容。 (在将来的版本中可能不再需要这样做了)

创建表格

create table part_parq_table (
    id int,
    name string
    )
partitioned by (date string)
stored as parquet

完成后,您可以轻松读取csv并将数据帧保存到该表。第二步使用dateformat覆盖列日期,如“yyyy-mm-dd”。对于每个值,将创建一个文件夹,其中包含特定的行。

SCALA Spark-Shell示例:

spark.sqlContext.setConf("hive.exec.dynamic.partition", "true") 
spark.sqlContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")

前两行是hive配置,这些配置是创建不存在的分区文件夹所必需的。

var df=spark.read.format("csv").option("header","true").load("/tmp/test.csv")
df=df.withColumn("date",substring(col("date"),0,10))
df.show(false)
df.write.format("parquet").mode("append").insertInto("part_parq_table")

插入完成后,您可以直接查询表格,例如“select * from part_parq_table”。 文件夹将在默认cloudera的表文件夹中创建,例如HDFS:///用户/蜂巢/仓库/ part_parq_table

希望有所帮助 BR

答案 2 :(得分:-1)

读取csv文件/user/hduser/wikipedia/pageviews-by-second-tsv

"timestamp"             "site"  "requests"
"2015-03-16T00:09:55"   "mobile"        1595
"2015-03-16T00:10:39"   "mobile"        1544

以下代码使用spark2.0

import org.apache.spark.sql.types._
var wikiPageViewsBySecondsSchema = StructType(Array(StructField("timestamp", StringType, true),StructField("site", StringType, true),StructField("requests", LongType, true) ))
var wikiPageViewsBySecondsDF = spark.read.schema(wikiPageViewsBySecondsSchema).option("header", "true").option("delimiter", "\t").csv("/user/hduser/wikipedia/pageviews-by-second-tsv")

将字符串时间戳转换为时间戳

wikiPageViewsBySecondsDF= wikiPageViewsBySecondsDF.withColumn("timestampTS", $"timestamp".cast("timestamp")).drop("timestamp")
or 
wikiPageViewsBySecondsDF= wikiPageViewsBySecondsDF.select($"timestamp".cast("timestamp"), $"site", $"requests") 

写入镶木地板文件。

wikiPageViewsBySecondsTableDF.write.parquet("/user/hduser/wikipedia/pageviews-by-second-parquet")