2

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

4

2 回答 2

0

由于您在文件中拥有所有必需的数据,并且您要附加的列是常量,因此这也可以使用简单的案例类和createDataFrame在 Scala 中完成。提供一个与 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)

请参阅数据帧 API

于 2017-05-19T09:15:39.100 回答
0

我强烈建议使用开箱即用的支持 CSV 文件的最新最好的Spark 2.1.1 。


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

使用加载的包启动 Spark 环境:

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

这为您提供了 csv 格式的支持。

从包的主页

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()您的方法的问题SQLContext

write().saveAsTable(tableName)

请参阅数据帧 API

于 2017-05-19T07:29:54.100 回答