[英]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 API和Spark-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有幫助
/user/hduser/wikipedia/pageviews-by-second-tsv
"timestamp" "site" "requests"
"2015-03-16T00:09:55" "mobile" 1595
"2015-03-16T00:10:39" "mobile" 1544
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.