PySpark Sql с именем столбца, содержащим тире / дефис в нем

#python #apache-spark #pyspark

#python #apache-spark #pyspark

Вопрос:

У меня есть PySpark dataframe df

 data = {'Passenger-Id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},'Age': {0: 22, 1: 38, 2: 26, 3: 35, 4: 35}}
df_pd = pd.DataFrame(data, columns=data.keys())
df = spark.createDataFrame(df_pd)
  
  ------------ --- 
|Passenger-Id|Age|
 ------------ --- 
|           1| 22|
|           2| 38|
|           3| 26|
|           4| 35|
|           5| 35|
 ------------ --- 
  

Это работает

    df.filter(df.Age == 22).show()
  

Но ниже не работает, из-за — в имени столбца

     df.filter(df.Passenger-Id == 2).show()
  

Ошибка атрибута: объект ‘DataFrame’ не имеет атрибута ‘Passenger’

Я тоже сталкиваюсь с такой же проблемой в spark sql,

         spark.sql("SELECT  Passenger-Id FROM AutoMobile").show()

        spark.sql("SELECT  automobile.Passenger-Id FROM AutoMobile").show()
  

Получение ошибки ниже

Исключение AnalysisException: не удается разрешить ‘ Passenger ‘ заданные входные столбцы: [автомобиль.Возраст, автомобиль.Passenger-Id]

Попытался указать имя столбца в одинарных кавычках, как рекомендуется в некоторых источниках, теперь он просто печатает столбец, упомянутый в запросе

   spark.sql("SELECT  'Passenger-Id' FROM AutoMobile").show()
  
  ------------ 
|Passenger-Id|
 ------------ 
|Passenger-Id|
|Passenger-Id|
|Passenger-Id|
|Passenger-Id|
|Passenger-Id|
 ------------ 
  

Ответ №1:

Поскольку у вас есть hiphen в имени столбца, я предлагаю вам использовать col() функцию из sql.functions

 import pyspark.sql.functions as F
df.filter(F.col('Passenger-Id')== 2).show()
  

Вот результат

  ------------ --- 
|Passenger-Id|Age|
 ------------ --- 
|           2| 38|
 ------------ --- 
  

Noe для синтаксиса sql вам нужно использовать специальный символ » ` «, а не одинарную кавычку, как показано ниже

 df.createOrReplaceTempView("AutoMobile")
spark.sql("SELECT  * FROM AutoMobile where `Passenger-Id`=2").show()
  

Комментарии:

1. Для меня сработало приведенное ниже, двойные кавычки внутри одинарной кавычки. импортируйте pyspark.sql.functions как F df.filter(F.col(‘»Passenger-Id»‘)== 2).показать()

Ответ №2:

Для меня сработало приведенное ниже, двойные кавычки внутри одинарной кавычки.

 import pyspark.sql.functions as F 

df.filter(F.col('"Passenger-Id"')== 2).show()