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