[SCALA] 어떻게 중복 된 열은 후 가입 피하기 위해?
SCALA어떻게 중복 된 열은 후 가입 피하기 위해?
나는 다음과 같은 열이 dataframes 있습니다 :
df1.columns
// Array(ts, id, X1, X2)
과
df2.columns
// Array(ts, id, Y1, Y2)
내가 할 후
val df_combined = df1.join(df2, Seq(ts,id))
나는 다음과 같은 열이 끝날 : 배열 (TS, ID, X1, X2, TS, ID, Y1, Y2)를. 나는 일반적인 열이 감소 될 것으로 예상 할 수있다. 일을해야 추가 뭔가가 있나요?
해결법
-
==============================
1.(이 문제에 Databricks FAQ)에서 간단한 대답 대신 술어의 접합 컬럼 문자열 (또는 문자열)의 배열로 표현되는 위치 조인 수행하는 것이다.
(이 문제에 Databricks FAQ)에서 간단한 대답 대신 술어의 접합 컬럼 문자열 (또는 문자열)의 배열로 표현되는 위치 조인 수행하는 것이다.
아래는 Databricks 자주 묻는 질문에서하지만 두 사람은 원래 포스터의 질문에 대답하기 위해 열을 조인하여 적응 예입니다.
여기에 왼쪽 dataframe입니다 :
val llist = Seq(("bob", "b", "2015-01-13", 4), ("alice", "a", "2015-04-23",10)) val left = llist.toDF("firstname","lastname","date","duration") left.show() /* +---------+--------+----------+--------+ |firstname|lastname| date|duration| +---------+--------+----------+--------+ | bob| b|2015-01-13| 4| | alice| a|2015-04-23| 10| +---------+--------+----------+--------+ */
여기에 바로 dataframe입니다 :
val right = Seq(("alice", "a", 100),("bob", "b", 23)).toDF("firstname","lastname","upload") right.show() /* +---------+--------+------+ |firstname|lastname|upload| +---------+--------+------+ | alice| a| 100| | bob| b| 23| +---------+--------+------+ */
여기에 잘못된 조인 열이 왼쪽 술어 ( "FIRSTNAME")로 정의 솔루션, === 권리 ( "FIRSTNAME") && 왼쪽 ( "LASTNAME") === (이하 "LASTNAME") 권리입니다.
잘못된 결과는 이름 및 성 열이 결합 된 데이터 프레임에 중복되어 있다는 것입니다 :
left.join(right, left("firstname")===right("firstname") && left("lastname")===right("lastname")).show /* +---------+--------+----------+--------+---------+--------+------+ |firstname|lastname| date|duration|firstname|lastname|upload| +---------+--------+----------+--------+---------+--------+------+ | bob| b|2015-01-13| 4| bob| b| 23| | alice| a|2015-04-23| 10| alice| a| 100| +---------+--------+----------+--------+---------+--------+------+ */
올바른 용액 ( "LASTNAME", "FIRSTNAME") 문자열 서열의 배열로 결합 열을 정의한다. 출력 데이터 프레임은 중복 된 열이 없습니다 :
left.join(right, Seq("firstname", "lastname")).show /* +---------+--------+----------+--------+------+ |firstname|lastname| date|duration|upload| +---------+--------+----------+--------+------+ | bob| b|2015-01-13| 4| 23| | alice| a|2015-04-23| 10| 100| +---------+--------+----------+--------+------+ */
-
==============================
2.이것은 예상 된 동작입니다. SQL은 다음과 같이 가입에 DataFrame.join 방법은 동일합니다
이것은 예상 된 동작입니다. SQL은 다음과 같이 가입에 DataFrame.join 방법은 동일합니다
SELECT * FROM a JOIN b ON joinExprs
중복 열을 무시하려면 단지 그들을 떨어 뜨리거나 이후 관심의 열을 선택합니다. 당신은 당신이 액세스에게 이러한 사용하여 부모 DataFrames을 사용할 수 있습니다 명확 할 경우 :
val a: DataFrame = ??? val b: DataFrame = ??? val joinExprs: Column = ??? a.join(b, joinExprs).select(a("id"), b("foo")) // drop equivalent a.alias("a").join(b.alias("b"), joinExprs).drop(b("id")).drop(a("foo"))
또는 별칭을 사용합니다 :
// As for now aliases don't work with drop a.alias("a").join(b.alias("b"), joinExprs).select($"a.id", $"b.foo")
들어 두 문자열의 순서를 취 특별 바로 가기 구문이 존재 동등 조인
val usingColumns: Seq[String] = ??? a.join(b, usingColumns)
또는 단일 문자열로
val usingColumn: String = ??? a.join(b, usingColumn)
이는 조인 조건에 사용되는 열을 하나의 사본을 보관.
-
==============================
3.나는 잠시 동안이 붙어되었고, 최근에 나는 아주 쉽게 어떤 해결책을했다.
나는 잠시 동안이 붙어되었고, 최근에 나는 아주 쉽게 어떤 해결책을했다.
A는 말
scala> val a = Seq(("a", 1), ("b", 2)).toDF("key", "vala") a: org.apache.spark.sql.DataFrame = [key: string, vala: int] scala> a.show +---+----+ |key|vala| +---+----+ | a| 1| | b| 2| +---+----+ and scala> val b = Seq(("a", 1)).toDF("key", "valb") b: org.apache.spark.sql.DataFrame = [key: string, valb: int] scala> b.show +---+----+ |key|valb| +---+----+ | a| 1| +---+----+
나는 dataframe A의 값만 선택하려면이 작업을 수행 할 수 있습니다 :
scala> a.join(b, a("key") === b("key"), "left").select(a.columns.map(a(_)) : _*).show +---+----+ |key|vala| +---+----+ | a| 1| | b| 2| +---+----+
-
==============================
4.당신은 단순히 이것을 사용할 수 있습니다
당신은 단순히 이것을 사용할 수 있습니다
df1.join(df2, Seq("ts","id"),"TYPE-OF-JOIN")
여기있다-TYPE OF은 조인
예를 들어,이 같은 두 dataframes 있습니다 :
// df1 word count1 w1 10 w2 15 w3 20 // df2 word count2 w1 100 w2 150 w5 200
당신이 외부 전체에 가입 할 경우, 결과는 다음과 같다
df1.join(df2, Seq("word"),"fullouter").show() word count1 count2 w1 10 100 w2 15 150 w3 20 null w5 null 200
-
==============================
5.이것은 내가 이것을 위해 뭘 오전 SQL에서 정상적인 동작입니다 :
이것은 내가 이것을 위해 뭘 오전 SQL에서 정상적인 동작입니다 :
여기에 나는 "전체 이름"열을 대체하고 있습니다 :
자바의 일부 코드 :
this .sqlContext .read() .parquet(String.format("hdfs:///user/blablacar/data/year=%d/month=%d/day=%d", year, month, day)) .drop("fullname") .registerTempTable("data_original"); this .sqlContext .read() .parquet(String.format("hdfs:///user/blablacar/data_v2/year=%d/month=%d/day=%d", year, month, day)) .registerTempTable("data_v2"); this .sqlContext .sql(etlQuery) .repartition(1) .write() .mode(SaveMode.Overwrite) .parquet(outputPath);
어디 쿼리는 다음과 같습니다
SELECT d.*, concat_ws('_', product_name, product_module, name) AS fullname FROM {table_source} d LEFT OUTER JOIN {table_updates} u ON u.id = d.id
이것은 당신은 내가 (목록에서 열을 삭제) 생각 스파크와 함께 할 수있는 일, 아주 많은 도움이 될 것입니다!
-
==============================
6.이 시도,
이 시도,
val df_combined = df1.join(df2, df1("ts") === df2("ts") && df1("id") === df2("id")).drop(df2("ts")).drop(df2("id"))
-
==============================
7.가장 좋은 방법은 그들에 합류하기 전에 DF 모두에서 열 이름이 다른하고 그에 따라 드롭하는 것입니다.
가장 좋은 방법은 그들에 합류하기 전에 DF 모두에서 열 이름이 다른하고 그에 따라 드롭하는 것입니다.
df1.columns = [ID, 나이, 소득] df2.column = [ID, AGE_GROUP]
df1.join (DF2에 df1.id = == df2.id 어떻게 = '내부'). write.saveAsTable ( 'TABLE_NAME')
// 중복 열에 대한 오류 동안 오류를 반환합니다
// 대신에 이것을 시도
df1.join (df2.withColumnRenamed ( 'ID', 'ID_2')에 df1.id = == df2.id_2 어떻게 = '내부'). 드롭 ( 'ID_2')
-
==============================
8.내가 함께 여러 테이블에 합류 한 후, 나는 그것이 중복 발생하는 경우 DF의 열 이름을 변경하는 간단한 함수를 통해 실행합니다. 양자 택일로, 당신은 너무이 중복 된 열을 삭제할 수 있습니다.
내가 함께 여러 테이블에 합류 한 후, 나는 그것이 중복 발생하는 경우 DF의 열 이름을 변경하는 간단한 함수를 통해 실행합니다. 양자 택일로, 당신은 너무이 중복 된 열을 삭제할 수 있습니다.
어디 이름은 열 [ '아이디', '날짜', '설명', 열 아이디 및 설명이있는 테이블 컬럼 [ '아이디', '이름', 'DateId', '설명']와 날짜와 테이블입니다 가입 후 중복됩니다.
Names = sparkSession.sql("SELECT * FROM Names") Dates = sparkSession.sql("SELECT * FROM Dates") NamesAndDates = Names.join(Dates, Names.DateId == Dates.Id, "inner") NamesAndDates = deDupeDfCols(NamesAndDates, '_') NamesAndDates.saveAsTable("...", format="parquet", mode="overwrite", path="...")
deDupeDfCols는 다음과 같이 정의되는 경우 :
def deDupeDfCols(df, separator=''): newcols = [] for col in df.columns: if col not in newcols: newcols.append(col) else: for i in range(2, 1000): if (col + separator + str(i)) not in newcols: newcols.append(col + separator + str(i)) break return df.toDF(*newcols)
결과적인 데이터 프레임은 열을 포함 할 것이다 [ '아이디', '이름', 'DateId', '정보', 'ID2', '날짜', '내용 입력란'].
나는 스칼라에 익숙하지 않은 해요,하지만 이것은 내가이 문제를 봤 때 와서 질문하고 있었고, 난 스칼라 코드가 너무 다르지 않다 확신 - 사과이 답변이 파이썬에 있습니다.
from https://stackoverflow.com/questions/35258506/how-to-avoid-duplicate-columns-after-join by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 이 자바 스크립트에 의해으로 업데이트 한 후 변경된 HTML 콘텐츠를 가져 오기? (HtmlUnit과) (0) | 2019.10.31 |
---|---|
[SCALA] SparkSQL 어떻게 사용자 정의 함수에서 null 값을 처리하는 방법? (0) | 2019.10.31 |
[SCALA] 스칼라 문자 식별자에 대한 설명이 필요 (역 따옴표) (0) | 2019.10.31 |
[SCALA] 스파크에서 편평 행 (0) | 2019.10.31 |
[SCALA] 이해를 위해 스칼라에 불일치를 입력 (0) | 2019.10.31 |