Spark 1.5 및 Scala 2.10.6
"¦¦"를 구분 기호로 사용하는 데이터 파일이 있습니다. 데이터 프레임을 만들기 위해 이것을 파싱하는 데 어려움을 겪고 있습니다. 여러 구분 기호를 사용하여 데이터 프레임을 만들 수 있습니까? code는 끊어진 단일 파이프로 작동하지만 여러 구분 기호로는 작동하지 않습니다.
내 code :
val customSchema_1= StructType(Array(
StructField("ID", StringType, true),
StructField("FILLER", StringType, true),
StructField("CODE", StringType, true)));
val df_1= sqlContext.read
.format("com.databricks.spark.csv")
.schema(customSchema_1)
.option("delimiter", "¦¦")
.load("example.txt")
샘플 파일 :
12345¦¦ ¦¦10
다음과 같이 변환하는 것이 좋습니다. val text= sc.textFile ( "yourcsv.csv") val words= text.map (lines=>lines.split ( "\\ | \\ |") 그런 다음 다시 단일 파이프로 csv를 구성하고 당신의 접근 방식을 진행하십시오
Ram Ghadiyaram2021-02-22 08:51:07OP의 데이터에 이중 파이프가 포함 된 경우 문제가 될 수있는 @RamGhadiyaram은 spark.csv 구분 기호 옵션에 이스케이프를 사용하려고합니다.
evan.oman2021-02-22 08:51:07@RamGhadiyaram 제안 해 주셔서 감사합니다! .option ( "delimiter", "\\ ¦ \\ ¦")에 지 쳤고 지원되지 않는 특수 문자 오류가 발생했습니다.
SFatima2021-02-22 08:51:07@RamGhadiyaram ¦는 |
OneCricketeer2021-02-22 08:51:07- 답변 # 1
여기에서 발생하는 실제 오류는 다음과 같습니다.
java.lang.IllegalArgumentException: Delimiter cannot be more than one character: ¦¦
문서는이 제한을 확인하고 Spark 2.0 csv 리더를 확인했으며 동일한 요구 사항이 있습니다.
이 모든 것을 감안할 때 데이터가
¦¦
가 포함 된 항목이 없을 정도로 간단하다면 다음과 같이 데이터를로드합니다.scala> :pa //Entering paste mode (ctrl-D to finish) val customSchema_1= StructType(Array( StructField("ID", StringType, true), StructField("FILLER", StringType, true), StructField("CODE", StringType, true))); //Exiting paste mode, now interpreting. customSchema_1: org.apache.spark.sql.types.StructType= StructType(StructField(ID,StringType,true), StructField(FILLER,StringType,true), StructField(CODE,StringType,true)) scala> val rawData= sc.textFile("example.txt") rawData: org.apache.spark.rdd.RDD[String]= example.txt MapPartitionsRDD[1] at textFile at <console>:31 scala> import org.apache.spark.sql.Row import org.apache.spark.sql.Row scala> val rowRDD= rawData.map(line=> Row.fromSeq(line.split("¦¦"))) rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]= MapPartitionsRDD[3] at map at <console>:34 scala> val df= sqlContext.createDataFrame(rowRDD, customSchema_1) df: org.apache.spark.sql.DataFrame= [ID: string, FILLER: string, CODE: string] scala> df.show +-----+------+----+ | ID|FILLER|CODE| +-----+------+----+ |12345| | 10| +-----+------+----+
추가하는 방법 | ^ | Spark 2에서 csv 파일로 저장하는 동안 구분 기호
SUDARSHAN2021-02-22 10:03:07열 이름을 모르고 데이터를로드해야하는 경우가 있습니다. 이 경우 위의 접근 방식이 실패 할 것이라고 생각합니다.
donald2021-02-22 13:24:43 - 답변 # 2
나는 이것에 부딪 쳤고 좋은 해결책을 찾았습니다. 저는 스파크 2.3을 사용하고 있습니다. 스파크 2.2 이상에서 모두 작동해야한다고 생각하지만 테스트하지는 않았습니다. 작동 방식은
||
를tab
으로 바꾼 다음 내장 된 csv가. 데이터에 쉼표가 있기 때문에 탭을 사용했습니다.var df= spark.sqlContext.read .option("header", "true") .option("inferSchema", "true") .option("delimiter", "\t") .csv(spark.sqlContext.read.textFile("filename") .map(line=> line.split("\\|\\|").mkString("\t")))
다른 사람에게 도움이되기를 바랍니다.
수정 :
Spark 3.0.1부터는 기본적으로 작동합니다.
예 :
val ds= List("name||id", "foo||12", "brian||34", """"cray||name"||123""", "cray||name||123").toDS ds: org.apache.spark.sql.Dataset[String]= [value: string] val csv= spark.read.option("header", "true").option("inferSchema", "true").option("delimiter", "||").csv(ds) csv: org.apache.spark.sql.DataFrame= [name: string, id: string] csv.show +----------+----+ | name| id| +----------+----+ | foo| 12| | brian| 34| |cray||name| 123| | cray|name| +----------+----+
감사합니다, 이것은 완벽하게 작동합니다 (그리고 더 많은 찬성표가 있어야합니다)!
Kumar Vaibhav2021-02-22 15:05:31 - 답변 # 3
Spark2.8 이상부터는 다중 문자 구분 기호 지원이 추가되었습니다. https://issues.apache.org/jira/browse/SPARK-24540
@lockwobr이 제안한 위의 솔루션은 스칼라에서 작동합니다. Spark 2.8 이하에서 작업하고 PySpark에서 솔루션을 찾는 사람은 아래를 참조 할 수 있습니다.
ratings_schema= StructType([ StructField("user_id", StringType(), False) , StructField("movie_id", StringType(), False) , StructField("rating", StringType(), False) , StructField("rating_timestamp", StringType(), True) ]) #movies_df= spark.read.csv("ratings.dat", header=False, sep="::", schema=ratings_schema) movies_df= spark.createDataFrame( spark.read.text("ratings.dat").rdd.map(lambda line: line[0].split("::")), ratings_schema)
예제를 제공했지만 논리에 맞게 수정할 수 있습니다.
- 답변 # 4
우리는 다음과 같은 방법으로 사용자 정의 구분 기호가있는 데이터를 읽고 데이터 프레임의 열 이름을 사용자 정의하려고했습니다.
# Hold new column names saparately headers="JC_^!~_*>Year_^!~_*>Date_^!~_*>Service_Type^!~_*>KMs_Run^!~_*># '^!~_*>' This is field delimiter, so split string head= headers.split("^!~_*>") ## Below command splits the S3 file with custom delimiter and converts into Dataframe df= sc.textFile("s3://S3_Path/sample.txt").map(lambda x: x.split("^!~_*>")).toDF(head)
toDF ()의 매개 변수로 헤드를 전달하면 사용자 정의 구분 기호가있는 텍스트 파일에서 생성 된 데이터 프레임에 새 열 이름을 할당합니다.
도움이되기를 바랍니다.
이것을 시도해 보셨습니까 ( "\\ | \\ |")? 참조하십시오
Ram Ghadiyaram2021-02-22 08:51:07