>source

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

이것을 시도해 보셨습니까 ( "\\ | \\ |")? 참조하십시오

Ram Ghadiyaram2021-02-22 08:51:07

다음과 같이 변환하는 것이 좋습니다. val text= sc.textFile ( "yourcsv.csv") val words= text.map (lines=>lines.split ( "\\ | \\ |") 그런 다음 다시 단일 파이프로 csv를 구성하고 당신의 접근 방식을 진행하십시오

Ram Ghadiyaram2021-02-22 08:51:07

OP의 데이터에 이중 파이프가 포함 된 경우 문제가 될 수있는 @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 ()의 매개 변수로 헤드를 전달하면 사용자 정의 구분 기호가있는 텍스트 파일에서 생성 된 데이터 프레임에 새 열 이름을 할당합니다.

    도움이되기를 바랍니다.

  • 이전 javascript : AWS EC2에 배포 된 Nodejs에서 클라이언트의 퍼블릭 IP 찾기
  • 다음 REST 작업을 통해 Azure Security Center에서 경고를 해제 할 수 없습니다. UnsupportedResourceOperation