通过结构化流将数组扩展为Spark中的列

时间:2018-10-28 09:38:31

标签: apache-spark dataframe apache-kafka streaming

我有这个问题:

我正在使用结构化流从Kafka读取数据,数据是CSV行。当我从Kafka获得数据时,我有了一个流数据帧,其中CSV行位于“值”内,并且是字节序列。

 sDF2 = sDF.selectExpr("CAST(value as string)").select( split("value",","))

使用它,我有了一个新的数据框,其中“值”是一个字符串,它是CSV行。

如何获取已解析并将CSV字段拆分为数据框列的新数据框?

示例:     csv行是“ abcd,123,frgh,1321”

sDF schema, which contains the data downloaded from Kafka, is  
key, value, topic, timestamp etc... and here value is a byte sequence with no type

sDF2.schema has only a column ( named value of type string )

我喜欢新的数据框是

sDF3.col1 = abcd
sDF3.col2 = 123
sDF3.col3 = frgh ...etc

所有列均为字符串。

我仍然可以这样做:

 sDF3 = sDF2.select( sDF2.csv[0].alias("EventId").cast("string"),
 sDF2.csv[1].alias("DOEntitlementId").cast("string"),               
 sDF2.csv[3].alias("AmazonSubscriptionId").cast("string"),
 sDF2.csv[4].alias("AmazonPlanId").cast("string"),
 ... etc ... 

但是看起来很丑。

1 个答案:

答案 0 :(得分:0)

我还没有尝试过,但是类似的东西应该可以工作。

sDF2 = 
      sDF.selectExpr("CAST(value as string)")
       .alias("csv").select("csv.*")
       .select("split(value,',')[0] as DOEntitlementId", 
               "split(value,',')[1] as AmazonSubscriptionId", 
               "split(value,',')[2] as AmazonPlanId")