【问题标题】:Turn textfile into dataframe with Scala Spark使用 Scala Spark 将文本文件转换为数据框
【发布时间】:2020-03-24 04:28:43
【问题描述】:

我有一个来自 S3 的文本文件(实际上是多个 .gz 文件),我在下面编写了代码

val text = sc.textFile(path)
val df_text = text.map(row => row.split(",")).toDF()

但结果是这样的

+--------------------+
|               value|
+--------------------+
|[id, member_id, l...|
|[1077501, 1296599...|
|[1077430, 1314167...|
|[1077175, 1313524...|
|[1076863, 1277178...|
|[1075358, 1311748...|
|[1075269, 1311441...|
+--------------------+

我不能像 "val df = spark.read.format("csv").option("header", "true").load(path)" 那样阅读它,因为当我这样阅读它时'找不到标题:

+-----------+-----------+-----------+
|1077430    |1356730    |4525526    |...
+-----------+-----------+-----------+
|   41173430|    1356730|    1456430|...
|   10237430|    1356660|    1463750|...
+-----------+-----------+-----------+

我怎样才能使它成为一个合适的DataFrame?

【问题讨论】:

    标签: scala amazon-web-services amazon-s3


    【解决方案1】:

    在带有 scala 2.12.8 的 spark 2.4.0 中。

    很简单:

    val spark: SparkSession = SparkSession
          .builder
          .master("local[*]")
          .getOrCreate
    val sc = spark.sparkContext
    
    val myGZs= sc
          .textFile("s3://route//*.gz")
          .map(parseToObject)
          .filter(obj => obj != null)
    
    val myGZsDF = spark.createDataFrame(myGZs)
    myGZsDF.printSchema()
    

    parseToObject 是这样的函数:

    val parseToObject = (row: String) => {
       if (row is header) { //program this
          null
       }
       val split_row = row.split(",")
       Subscription(split_row[0].toLong, split_row[1].toLong ...)
    }
    

    Subscription案例类的一个例子:

    case class Subscription(id: Long, memberId: Long ...)
    

    mapfilter 都是窄转换!

    编辑:

    还看到了来自@kev 的link,关于如何读取多个 GZ 文件并将其转换为 DF。注意扩展名,它必须是.gz

    希望这会有所帮助。如果您有任何问题,请告诉我。 托马斯。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多