Spark SQL запрос данных - PullRequest
       4

Spark SQL запрос данных

0 голосов
/ 29 января 2020

Я преобразовал pandas фрейм данных в таблицу Spark sql. Я новичок в SQL и хотел бы выбрать ключ 'code' из таблицы.

запрос

sqlContext.sql("""SELECT `classification` FROM psyc""").show()

ответ на запрос

+--------------------+
|      classification|
+--------------------+
|[{'code': '3297',...|
|[{'code': '3410',...|
|[{'code': '3410',...|
|[{'code': '2227',...|
|[{'code': '3410',...|
+--------------------+

Как выбрать ключ «код». Столбец содержит список dict, который содержит данные.

 sqlContext.sql("""SELECT `classification.code` FROM psyc""").show() # this query does not work

Вот остаток кода

from pyspark.sql import SparkSession
from pyspark.sql import SQLContext

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL ") \
    .getOrCreate()

sc = spark.sparkContext                       
sqlContext = SQLContext(sc)

fp = os.path.join(BASE_DIR,'psyc.csv')
df = spark.read.csv(fp,header=True)
df.printSchema()
df.createOrReplaceTempView("psyc")

Это создает таблицу со следующей схемой

enter image description here

Ответы [ 2 ]

1 голос
/ 29 января 2020

Поле classification имеет тип string, поэтому сначала вам нужно преобразовать его в тип структуры, после чего вы можете непосредственно выбрать classification.code. Чтобы преобразовать строку в структуру, попробуйте ниже.

//Sample Dataframe
from pyspark.sql.types import *
df=spark.createDataFrame([(1,"[{'code':'1234','name':'manoj'},{'code':'124','name':'kumar'},{'code':'4567','name':'dhakad'}]",),(2,"[{'code':'97248','name':'joe'},{'code':'2424','name':'alice'},{'code':'464','name':'bob'}]",)],["id","classification",])

//df will be below
+---+--------------------+
| id|      classification|
+---+--------------------+
|  1|[{'code':'1234','...|
|  2|[{'code':'97248',...|
+---+--------------------+

//here is schema of above df
root
    |-- id: long (nullable = true)
    |-- classification: string (nullable = true) 


//df after converting classification column to the struct type and selecting only code.

schema = ArrayType(StructType([StructField('code', StringType()), StructField('name', StringType())]))
df1=df.withColumn('classification',from_json(col("classification"),schema=schema))

df2=df1.withColumn("code",col("classification.code"))

+---+--------------------+------------------+
| id|      classification|              code|
+---+--------------------+------------------+
|  1|[[1234,manoj], [1...| [1234, 124, 4567]|
|  2|[[97248,joe], [24...|[97248, 2424, 464]|
+---+--------------------+------------------+

//Here, I am going to select id and while exploding code column

df3=df2.select(col("id"),explode(col("code")))
df3.show()


//df3 output
+---+-----+
| id|  col|
+---+-----+
|  1| 1234|
|  1|  124|
|  1| 4567|
|  2|97248|
|  2| 2424|
|  2|  464|
+---+-----+
0 голосов
/ 29 января 2020

Попробуйте это

df.select(F.explode("classification").alias("classification")).select("classification.code").show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...