斯卡拉:最好的扫描仪来保存从卡夫卡到拼花格式的csv?

时间:2017-07-04 21:17:37

标签: scala schema parquet

我是scala / java的新手,所以请耐心等待。 我有一个spark spark和scala程序,它接收来自kafka的csv文件。我知道我现在得到的是一个带有简单线条的ReceiverInputDStream(还没有架构)。 我需要在HDFS中以镶木地板格式保存我收到的数据。我想我可以简单地保存线条,因为它们来自镶木地板文件(我可以吗?)。 但我也理解最好给普通线提供一些模式(列和类型),这样实木复合地板可以将数据转换为柱状格式并实现更好的压缩率。我对吗? 所以问题是,如何将我的ReceiverInputDStream转换为具有模式的东西(column1 type1,... columnN typeN)?需要什么样的对象类型? 那么如何将这个新对象保存到实木复合地板? 谢谢。

2 个答案:

答案 0 :(得分:0)

如果您碰巧使用Spark,则可以执行

ID     NAME    POINT
100    AAA     100
100    AAA     150
100    AAA     70
200    DDD     100
200    DDD     65
300    FFF     50

或者你可以使用相同的东西,但Spark Streaming作为Kafka客户端

答案 1 :(得分:0)

回答自己,我能够为RDD提供格式,同时使用以下代码将其转换为数据框

val viajesDF = splitRdd.map { case Array(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18) =>
yellowSchema(s0, s1, s2, s3.toInt, s4.toDouble, s5.toFloat, s6.toFloat, s7.toString, s8.toString,
s9.toFloat, s10.toFloat, s11, s12.toDouble, s13.toDouble,
s14.toDouble, s15.toDouble, s16.toDouble, s17.toDouble, s18.toDouble)
}.toDF()

在不同的scala对象

中,模式被定义为case类,如下所示
case class  yellowSchema (
                       vendor_id: String,
                       tpep_pickup_datetime: String,
                       tpep_dropoff_datetime: String,
                       passenger_count:  Long,
                       trip_distance: Double,
                       pickup_longitude: Float,
                       pickup_latitude: Float,
                       rate_code_id:  String,
                       store_and_fwd_flag:  String,
                       dropoff_longitude: Float,
                       dropoff_latitude: Float,
                       payment_type:  String,
                       fare_amount: Double,
                       extra: Double,
                       mta_tax: Double,
                       tip_amount: Double,
                       tolls_amount: Double,
                       improvement_surcharge: Double,
                       total_amount: Double
                     )

我终于以这种方式将DF写成镶木地板:

viajesDateDF.write.mode(SaveMode.Append).parquet(parquetDest)