【问题标题】:How to read a space-delimited text file and save it to Hive?如何读取以空格分隔的文本文件并将其保存到 Hive?
【发布时间】:2017-10-19 02:49:23
【问题描述】:

我有一个如下所示的字符串。第一行是标题,其余是列值。 我想从 String 创建一个数据框(Spark 1.6 和 Java7),并将 col3 和 col4 下的值转换为 DOUBLE 。

col1 col2 col3 col4 col5
val1 val2 val3 val4 val5
val6 val7 val8 val9 val10
val11 val12 val13 val14 val15

为上述创建数据框后,我有两个字段位于第一行,其值为常量。

const1 const2 col1 col2 col3 col4 col5
const1 const2 val1 val2 val3 val4 val5
const1 const2 val6 val7 val8 val9 val10
const1 const2 val11 val12 val13 val14 val15

我想用架构(const1 int、const2 int、col1 double、col2 double、col3 double、col4 double、col5 double)将上述数据框写入配置单元表。 我正在使用 Spark 1.6 和 Java7。

【问题讨论】:

    标签: java apache-spark apache-spark-sql apache-spark-1.6


    【解决方案1】:

    我强烈推荐使用最新最好的Spark 2.1.1,它支持开箱即用的 CSV 文件。


    除非我误认为 Spark 1.6 中的 CSV 支持是使用 spark-csv 包。

    在加载包的情况下启动您的 Spark 环境:

    --packages com.databricks:spark-csv_2.11:1.5.0
    

    这为您提供 csv 格式支持。

    来自包裹的homepage

    SQLContext sqlContext = new SQLContext(sc);
    DataFrame df = sqlContext.read()
        .format("com.databricks.spark.csv")  // <-- enables csv support in Spark SQL
        .option("inferSchema", "true")
        .option("header", "true")
        .load("cars.csv");
    

    您必须使用 delimiter 选项,因为它默认为逗号。

    分隔符默认使用,分隔列,但delimiter可以设置为任何字符

    将文件加载为 DataFrame 后,您可以使用 DataFrame.withColumn 方法添加常量列:

    public DataFrame withColumn(String colName, Column col)

    通过添加列或替换具有相同名称的现有列来返回新的 DataFrame。

    完成后,保存到 Hive 只需使用 SQLContextwrite() 方法,并且:

    write().saveAsTable(tableName)
    

    DataFrame API

    【讨论】:

      【解决方案2】:

      由于您在文件中拥有所有必需的数据,并且您要附加的列是常量,因此这也可以使用简单的案例类和 Scala 中的createDataFrame 来完成。提供一个与 Scala 相关的解决方案,它可能会帮助您了解应该如何处理该解决方案

      case class schema (const1: Int, const2: Int, col1: String, col2: String, col3: String, col4: String, col5: String)
      //Skip Header while loading the data
      val fileRDD = sc.textFile("file")
                      .mapPartitionsWithIndex{ (index, row) => if (index==0) row.drop(1) else row }
                      .map(x => x.split(" "))
                      .map(x => schema(1, 2, x(0), x(1), x(2), x(3), x(4) ))
      val df = sqlContext.createDataFrame(fileRDD)
      df.show()    
      +------+------+-----+-----+-----+-----+-----+
      |const1|const2| col1| col2| col3| col4| col5|
      +------+------+-----+-----+-----+-----+-----+
      |     1|     2| col1| col2| col3| col4| col5|
      |     1|     2| val1| val2| val3| val4| val5|
      |     1|     2| val6| val7| val8| val9|val10|
      |     1|     2|val11|val12|val13|val14|val15|
      +------+------+-----+-----+-----+-----+-----+
      

      正如 Jacek 所提到的,将数据加载到 hive:

      一旦完成,保存到 Hive 只需使用 SQLContext 的 write() 方法,并且:

      write().saveAsTable(tableName)
      

      DataFrame API

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 1970-01-01
        • 2014-06-20
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多