如何读取以空格分隔的文本文件并将其保存到Hive?

时间:2017-05-19 05:34:58

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

我有一个像下面这样的字符串。第一行是标题,其余是列值。 我想从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

我想将上述数据帧写入带有模式的hive表(const1 int,const2 int,col1 double,col2 double,col3 double,col4 double,col5 double)。 我使用的是Spark 1.6和Java7。

2 个答案:

答案 0 :(得分:1)

我强烈建议您使用支持CSV文件的最新且最好的Spark 2.1.1

除非我错误地在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只需使用write()的{​​{1}}方法,并且:

SQLContext

请参阅DataFrame API

答案 1 :(得分:0)

由于您拥有文件中的所有必需数据,并且要追加的列是常量,因此也可以使用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|
+------+------+-----+-----+-----+-----+-----+

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

  

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

write().saveAsTable(tableName)
  

请参阅DataFrame API