2017-12-19 14 views
2

マップを(キーと値のペアで)別の行に分解するために、DataframeをRDDに変換しようとしています。コロンで区切られた文字列をMapTypeに変換する方法は?

Info = sqlContext.read.format("csv"). \ 
option("delimiter","\t"). \ 
option("header", "True"). \ 
option("inferSchema", "True"). \ 
load("file.tsv") 

DataFrame[ID: int, Date: timestamp, Comments: string] 

DFのサンプルデータは、次のとおりです。

ID Date     Comments  
1 2015-04-30 22:42:49.0 {44:'xxxxxxxx'} 
2 2015-05-06 08:53:18.0 {83:'aaaaaaaaa', 175:'bbbbbbbbb', 86:'cccccccccc'} 
3 2015-05-13 19:57:13.0 {487:'yyyyyyyyyyy', 48:'zzzzzzzzzzzzzz'} 

さて、コメントは私が別の行に各キーと値のペアを爆発したい、キーと値のペアに既にあるが、それを文字列として読み込まれます。例えば、

Expected OUTPUT 
ID Date      Comments 
1 2015-04-30 22:42:49.0 {44:'xxxxxxxx'} 
2 2015-05-06 08:53:18.0 {83:'aaaaaaaaa'} 
2 2015-05-06 08:53:18.0 {175:'bbbbbbbbb'} 
2 2015-05-06 08:53:18.0 {86:'cccccccccc'} 
3 2015-05-13 19:57:13.0 {487:'yyyyyyyyyyy'} 
3 2015-05-13 19:57:13.0 {48:'zzzzzzzzzzzzzz'} 

私はRDDに変換し、しかし、誰成功にflatMapを適用しようとしています。すべての列が返されるようにします。私はこれを試してみました:

Info.rdd.flatMap(lambda x: (x['SearchParams'].split(':'), x)) 
+0

チープ・トリック: 'DFを( "comments")).withColumn( "comments"、split(regexp_replace(col "" comments ")、"、 "}、{")。as( "comments")、 "、")as( "comments")) ' – philantrovert

答えて

1

は「」にデータを分割するデータフレームのAPIで提供splitexplode機能を使用してください。マップを作成するには、create_mapを使用します。この関数は、2つの別個の列が入力として期待されます。ここでは、以下の2つの一時列が(再びsplitを使用して)作成された例は次のとおりです。

Info.withColumn("Comments", explode(split(col("Comments), ", "))) 
    .withColumn("key", split(col("Comments"), ":").getItem(0)) 
    .withColumn("value", split(col("Comments"), ":").getItem(1)) 
    .withColumn("Comments", create_map(col("key"), col("value"))) 

(テストしていません)このように、この短くすることが可能であるべきである:

Info.withColumn("Comments", split(explode(split(col("Comments), ", ")), ":") 
    .withColumn("Comments", create_map(col("Comments".getItem(0)), col("Comments").getItem(1))) 
+0

ありがとうございます。 私はあなたの提案を参照し、それは完全に正常に動作します。私は分割と爆発のために別々の関数を作成しましたが。 –

関連する問題