Почему удаление столбцов после объединения двух временных представлений в pyspark не работает, однако работает с объединениями фреймов данных? - PullRequest
0 голосов
/ 01 августа 2020

Мне нужно создать tempViews из фреймов данных, затем мне нужно присоединиться к этим tempviews и удалить повторяющиеся столбцы. Итак, я написал код, как указано ниже:

 Data1 = [  ("xx1",34,60),
           ("xx2",33,80),
           ("xx3",37,50) ]

dataSchema1 = StructType([
    StructField("Name",StringType(),True),
    StructField("Age",IntegerType(),True),
    StructField("Id",IntegerType(),True)
   ])

Data2 = [  (60,"M",3000.60),
           (80,"F",3300.80),
           (50,"M",5000.50) ]

dataSchema2 = StructType([
    StructField("Id",IntegerType(),True),
    StructField("Gender", StringType(), True),
    StructField("Salary", DoubleType(), True)
  ])

df1 = spark.createDataFrame(spark.sparkContext.parallelize(Data1),schema=dataSchema1)
df1.createOrReplaceTempView('view1')

df2 = spark.createDataFrame(spark.sparkContext.parallelize(Data2),schema=dataSchema2)
df2.createOrReplaceTempView('view2')

jDF=spark.sql("select * from view1 join view2 on view1.Id = view2.Id")
jDF.columns                 // ['Name', 'Age', 'Id', 'Id', 'Gender', 'Salary']
rjDF=jDF.drop('view2.ID')    //this function is not working
rjDF.columns                // ['Name', 'Age', 'Id', 'Id', 'Gender', 'Salary']

В приведенном выше коде метод drop column не работает должным образом, а также не вызывает никаких ошибок. Однако, если я попытаюсь отбросить столбцы с использованием фреймов данных (что, очевидно, не является предпочтительным выбором для меня в моем случае использования), тогда метод drop работает нормально.

joinDF=df1.join(df2, df1.Id == df2.Id)
dropped=joinDF.drop(df2.Id)    // working absolutely fine
dropped.columns               // ['Name', 'Age', 'Id', 'Gender', 'Salary']

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

1 Ответ

1 голос
/ 01 августа 2020

drop из набора данных требует для удаления column names или column. Это операция no-op, если схема не содержит column name(s).

drop внутренне использует analyzer.resolver, чтобы проверить, присутствует ли предоставленная строка в кадре данных или нет. Обратите внимание, что вы не можете предоставить синтаксис, подобный sql, для ссылки на столбцы в перетаскивании Если вы предоставите ту же искру, в качестве имени столбца будет принята вся строка.

selectExpr("..") и functions.expr("..") внутренне используют sessionState.sqlParser для синтаксического анализа sql подобного синтаксиса ссылочных столбцов, например <table/view name>.<column_name>.

попробуйте использовать то же самое с expr функция, если вы хотите использовать sql как синтаксис -

rjDF=jDF.drop(F.expr('view2.Id'))

иначе вы можете go с вашим рабочим столбцом на основе drop -

dropped=joinDF.drop(df2.Id)
...