2017-05-19 3 views
1

私は以下のような文字列を持っています。最初の行はヘッダーで、残りは列の値です。 文字列からデータフレーム(Spark 1.6とJava7)を作成し、col3とcol4の値をDOUBLEとして変換したいとします。スペース区切りのテキストファイルを読み取ってHiveに保存する方法は?

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

上記のデータフレームを作成した後、値が定数である最初の行に2つのフィールドがあります。

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、COL2ダブルダブル、ダブルcol3という、二重のCOL5、ダブルCOL4)。 私はSpark 1.6とJava7を使用しています。

答えて

0

すぐに使用できるCSVファイルをサポートする最新かつ最高のSpark 2.1.1を使用することを強くお勧めします。


私は、Spark 1.6に間違ってCSVをサポートしていない限りspark-csvパッケージを使用することです。

がロードされたパッケージを使用してスパーク環境を起動し

--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.withColumnメソッドを使用して一定の列を追加することができますDATAFRAMEとしてロードされたファイルでは、任意の文字

に設定することができます。

public DataFrame withColumn(String colName, Column col)

Ret列を追加するか、同じ名前を持つ既存の列を置き換えることによって、新しいDataFrameを返します。一度行わ

、ハイブに保存すると、あなたのSQLContextwrite()方法を使用するだけですと:

write().saveAsTable(tableName) 

DataFrame APIを参照してください。

0

ファイルに必要なすべてのデータがあり、追加する列が定数なので、これはScalaのシンプルなケースクラスとcreateDataFrameを使用して行うこともできます。ヤツェクが述べたように、あなたは解決策のためにハイブに

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| 
+------+------+-----+-----+-----+-----+-----+ 

と読み込みデータにアプローチする方法を理解するのに役立つかもしれないScalaの関連ソリューションの提供:

一度行わ

を、ハイブに保存することだけですあなたのSQLContextのwrite()メソッドを使用しての問題と:

write().saveAsTable(tableName) 

を参照してくださいDataFrame API

関連する問題