python pyspark에서 sqlContext의 dataframe 구조에서 특정 컬럼을 explode 하는 방법이 있을까요?

조회수 807회
%pyspark
sc.stop()
from pyspark import SparkConf, SparkContext, SQLContext
from pyspark.sql.functions import explode
import json


conf = SparkConf().setMaster("spark://local").setAppName("text")
sc = SparkContext(conf = conf)
sqlContext = SQLContext(sc)
df = sqlContext.read.json("file:///home/test/data/test.json")
df.select(df.data).show()

위 코드처럼 전체 dataframe에서 data라는 컬럼만 select해서 show()하면

| data |

row({key:val1, key2:val1})

row({key:val2, key2:val2})

row({key:val3, key2:val3})

row({key:val4, key2:val4})

대충 이런 구조로 선택됩니다. 그런데 최종적으로 원하는 구조는 key와 key2가 컬럼명으로 오고 각 컬럼에 맞춰 value들이 위치하게 구조를 바꾸고 싶은데 어떻게 하면좋을까요? python이나 spark문법 중에 알려주시면 감사하겠습니다.

1 답변

  • val jsonStr = Seq("""{"id" : "1", "name": "aaaaa", "addr": "seoul", "data": "{\"column_name1\":\"value1\",\"column_name2\":\"value2\"}"}""", 
                      """{"id" : "2", "name": "bbbbb", "addr": "pusan", "data": "{\"column_name1\":\"value3\",\"column_name2\":\"value4\"}"}""") 
    val rddData = spark.sparkContext.parallelize(jsonStr)
    val resultDF = spark.read.json(rddData)
    
    resultDF.selectExpr("id", "name", "addr", "get_json_object(data, '$.column_name1') as column_name1", "get_json_object(data, '$.column_name2') as column_name2").show()
    
    +---+-----+-----+------------+------------+
    | id| name| addr|column_name1|column_name2|
    +---+-----+-----+------------+------------+
    |  1|aaaaa|seoul|      value1|      value2|
    |  2|bbbbb|pusan|      value3|      value4|
    +---+-----+-----+------------+------------+
    
    • 답변 코드 scala인거 같은데 해당 함수들 python에서도 동작하나요? 김재민 2020.6.24 10:22
    • 네...코드는 scala지만 spark 메소드들만 사용했습니다. spark 를 사용할 생각이라면 scala도 함께 익히시길 바랍니다. spark 관련 서적이나 인터넷의 자료들이 아무래도 scala 코드로 작성된 자료가 많기도하고 pyspark 는 jvm <-> python 간(ipc 형태)에 데이터 이동시 형변환등 비용이 있어서 성능이 좀 떨어집니다. 정영훈 2020.6.24 12:17

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)