org.apache.spark.sql.AnalysisException: не удается разрешить - PullRequest
0 голосов
/ 28 января 2019

Случай 1: Когда я пытаюсь получить «b.no» с сообщением об ошибке, ниже сообщается код, а также сообщение об ошибке.Как я могу получить значения из второго кадра данных (то есть с псевдонимом b).разрешен ли выбор значений из b или нет здесь.Если я удаляю b.no, он работает нормально.

df1.csv нет, имя, sal 1, sri, 3000 2, ram, 2000 3, sam, 2500 4, kri,5000 5, том, 4000

df2.csv нет, имя, соль 1, шри, 3000 1, вас, 4000 2, баран, 2000 3, сам, 2500 4, кри,5000 5, Том, 4500 5, игрушка, 4200 5, Кой, 4999 6, Джим, 3090 7, Ким, 2080

код:

from pyspark.shell import spark
from pyspark.sql import SQLContext

sc = spark.sparkContext
sqlContext = SQLContext(sc)

df11 = spark.read.option("header","true").option("delimiter", ",").csv("C:\\inputs\\df1.csv")
df22 = spark.read.option("header","true").option("delimiter", ",").csv("C:\\inputs\\df2.csv")
print("df11", df11.count())
print("df22", df22.count())

resDF = df11.alias("a").join(df22.alias("b"), on='no').select("a.no", "a.name", "b.no")
print("resDF", resDF.count())
print("resDF", resDF.distinct().show())

Ошибка:

py4j.protocol.Py4JJavaError: Произошла ошибка при вызове o48.select.: org.apache.spark.sql.AnalysisException: невозможно разрешить 'b.no' для указанных входных столбцов: [b.sal, a.no, b.name, a.sal, a.name] ;;pyspark.sql.utils.AnalysisException: «не удается разрешить« b.no »для заданных входных столбцов: [b.sal, a.no, b.name, a.sal, a.name] ;; \ n'Project [no #10, имя № 11, 'b.no] \ n + - AnalysisBarrier \ n + - Проект [№ № 10, имя № 11, номер № 12, имя № 27, номер № 28] \ n + - Join Inner, (нет# 10 = нет № 26) \ n: - SubqueryAlias ​​a \ n: + - Отношение [№ 10, имя № 11, sal # 12] csv \ n + - SubqueryAlias ​​b \ n + - Отношение [№ 26, имя# 27, sal # 28] csv \ n "

Случай 2: когда я использую b.sal, получая дублирующиеся значения, он не отфильтровывается.

    resDF = df11.alias("a").join(df22.alias("b"), on='no').select("a.no", "a.name", "b.sal")      
print("resDF", resDF.distinct().show())

В этом случае, как получить различные значения, основанные только на «нет».

1 Ответ

0 голосов
/ 28 января 2019

Проблема в case1 заключается в том, что когда вы используете строку (или тип массива) в качестве аргумента соединения, spark добавит только a.no, а не b.no, чтобы избежать дублирования столбцов после объединения (см. link для дополнительной информации).Вы можете избежать этого, определив выражение соединения, например, F.col ('a.no') == col ('b.no').См. Полный пример ниже:

from pyspark.sql import types as T
from pyspark.sql import functions as F
columns1 = ['no','name','sal']
columns2 = ['no','name','sal']

vals1 = [(1,'sri',3000) ,(2,'ram',2000) ,(3,'sam',2500) ,(4,'kri',5000) ,(5,'tom',4000)]

vals2 = [(1,'sri',3000) ,(1,'vas',4000) ,(2,'ram',2000) ,(3,'sam',2500), (4,'kri',5000) ,(5,'tom',4500) ,(5,'toy',4200) ,(5,'koy',4999) ,(6,'jim',3090) ,(7,'kim',2080)]

df1 = spark.createDataFrame(vals1, columns1)
df2 = spark.createDataFrame(vals2, columns2)
#here I use a expression instead of a string
resDF = df1.alias("a").join(df2.alias("b"), F.col('a.no') == col('b.no')).select("a.no", "a.name", "b.no")
resDF.show()

Вывод:

+---+----+---+ 
| no|name| no| 
+---+----+---+ 
|  0|   1|  0| 
+---+----+---+

Для вашего Case2: метод dataframe отдельный сравнивает каждую строку кадра данных.Когда вам нужны только уникальные значения одного столбца, вы должны сначала выполнить выборку:

resDF = df1.alias("a").join(df2.alias("b"), F.col('a.no') == col('b.no')).select("a.no", "a.name", "b.sal")      
resDF.select('no').distinct().show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...