簡體   English   中英

使用Spark將csv.gz文件轉換為Parquet

[英]Convert csv.gz files into Parquet using Spark

我需要使用Spark(首選Scala)將AWS S3和HDFS中的文件夾中的csv.gz文件轉換為Parquet文件。 數據的一列是時間戳記,而我只有一周的數據集。 時間戳格式為:

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

我希望輸出的是每天都有一個文件夾(或分區),該文件夾用於該特定日期的Parquet文件位於其中。 因此,將有7個輸出文件夾或分區。

我對如何執行此操作只有一個模糊的想法,只有sc.textFile在我的腦海中。 Spark中是否有可以轉換為Parquet的函數? 如何在S3和HDFS中實現此功能?

感謝您的幫助。

如果您查看Spark Dataframe APISpark-CSV軟件包 ,這將實現您要執行的大部分操作-將CSV文件讀入數據幀,然后將數據幀寫成實木復合地板將使您獲得最大收益那里的方式。

您仍然需要執行一些步驟來解析時間戳並使用結果對數據進行分區。

舊主題,但如果認為答案不正確,則認為即使回答舊主題也很重要。

在Spark版本> = 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

首先,您需要創建配置單元,以便Spark編寫的數據與配置單元架構兼容。 (將來的版本中可能不再需要此功能)

創建表:

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

完成后,您可以輕松讀取csv並將數據幀保存到該表中。第二步使用“ yyyy-mm-dd”之類的日期格式覆蓋列日期。 對於每個值,將創建一個包含特定行的文件夾。

SCALA Spark-Shell示例:

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

前兩行是配置文件配置所需要的配置單元配置,該配置文件尚不存在。

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")

插入完成后,您可以直接查詢表,例如“從part_parq_table中選擇*”。 這些文件夾將在默認cloudera的表文件夾中創建,例如hdfs:/// users / hive / warehouse / part_parq_table

希望對BR有幫助

讀取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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM