変革:行の数は300.000で、「テキスト」フィールドが文字列であるデータフレーム
+---------+--------------+------------------------------------------------------------------------------------------------------+ | country | date_data | text | +---------+--------------+------------------------------------------------------------------------------------------------------+ | "EEUU" | "2016-10-03" | "T_D: QQWE\nT_NAME: name_1\nT_IN: ind_1\nT_C: c1ws12\nT_ADD: Sec_1_P\n ...........\nT_R: 45ee" | | "EEUU" | "2016-10-03" | "T_D: QQAA\nT_NAME: name_2\nT_IN: ind_2\nT_C: c1ws12\nT_ADD: Sec_1_P\n ...........\nT_R: 46ee" | | . | . | . | | . | . | . | | "EEUU" | "2016-10-03" | "T_D: QQWE\nT_NAME: name_300000\nT_IN: ind_65\nT_C: c1ws12\nT_ADD: Sec_1_P\n ...........\nT_R: 47aa" | +---------+--------------+------------------------------------------------------------------------------------------------------+
を約5000文字です。
私は、この新しいフィールドにフィールド「テキスト」を分離したいと思います:
+---------+------------+------+-------------+--------+--------+---------+--------+------+ | country | date_data | t_d | t_name | t_in | t_c | t_add | ...... | t_r | +---------+------------+------+-------------+--------+--------+---------+--------+------+ | EEUU | 2016-10-03 | QQWE | name_1 | ind_1 | c1ws12 | Sec_1_P | ...... | 45ee | | EEUU | 2016-10-03 | QQAA | name_2 | ind_2 | c1ws12 | Sec_1_P | ...... | 45ee | | . | . | . | . | . | . | . | . | | | . | . | . | . | . | . | . | . | | | . | . | . | . | . | . | . | . | | | EEUU | 2016-10-03 | QQWE | name_300000 | ind_65 | c1ws12 | Sec_1_P | ...... | 47aa | +---------+------------+------+-------------+--------+--------+---------+--------+------+は現在、正規表現を使用して - 私はこの問題を解決すること。まず、私は、通常expresionsを記述したテキスト(合計で90個の正規表現)からの個々のフィールドを抽出する関数を作成する:
val D_text = "((?<=T_D:).*?(?=\\\\n))".r
val NAME_text = "((?<=nT_NAME:).*?(?=\\\\n))".r
val IN_text = "((?<=T_IN:).*?(?=\\\\n))".r
val C_text = "((?<=T_C:).*?(?=\\\\n))".r
val ADD_text = "((?<=T_ADD:).*?(?=\\\\n))".r
.
.
.
.
val R_text = "((?<=T_R:).*?(?=\\\\n))".r
//UDF function:
def getFirst(pattern2: scala.util.matching.Regex) = udf(
(url: String) => pattern2.findFirstIn(url) match {
case Some(texst_new) => texst_new
case None => "NULL"
case null => "NULL"
}
)
そして、私は新たなデータフレーム(tbl_separate_fields)を作成して機能を適用した結果としてテキストから新しいフィールドをすべて抽出する正規表現。
val tbl_separate_fields = hiveDF.select(
hiveDF("country"),
hiveDF("date_data"),
getFirst(D_text)(hiveDF("texst")).alias("t_d"),
getFirst(NAME_text)(hiveDF("texst")).alias("t_name"),
getFirst(IN_text)(hiveDF("texst")).alias("t_in"),
getFirst(C_text)(hiveDF("texst")).alias("t_c"),
getFirst(ADD_text)(hiveDF("texst")).alias("t_add"),
.
.
.
.
getFirst(R_text)(hiveDF("texst")).alias("t_r")
)
は最後に、私はハイブテーブルにこのデータフレームを挿入します。私は最適化し、実行時間を短縮したいので
tbl_separate_fields.registerTempTable("tbl_separate_fields")
hiveContext.sql("INSERT INTO TABLE TABLE_INSERT PARTITION (date_data) SELECT * FROM tbl_separate_fields")
このソリューションは、全体のデータフレームのための1時間持続します。解決策はありますか?
ハドープ2.7.1とApache-Spark 1.5.1です。スパークの設定は:
val conf = new SparkConf().set("spark.storage.memoryFraction", "0.1")
val sc = new SparkContext(conf)
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
ありがとうございます。
EDITデータ:
+---------+--------------+------------------------------------------------------------------------------------------------------+ | country | date_data | text | +---------+--------------+------------------------------------------------------------------------------------------------------+ | "EEUU" | "2016-10-03" | "T_D: QQWE\nT_NAME: name_1\nT_IN: ind_1\nT_C: c1ws12\nT_ADD: Sec_1_P\n ...........\nT_R: 45ee" | | "EEUU" | "2016-10-03" | "T_NAME: name_2\nT_D: QQAA\nT_IN: ind_2\nT_C: c1ws12 ...........\nT_R: 46ee" | | . | . | . | | . | . | . | | "EEUU" | "2016-10-03" | "T_NAME: name_300000\nT_ADD: Sec_1_P\nT_IN: ind_65\nT_C: c1ws12\n ...........\nT_R: 47aa" | +---------+--------------+------------------------------------------------------------------------------------------------------+
ご回答ありがとうございます。すべてのレコードが同じ構造を持っていること、つまりすべての "テキスト"値が同じ数と順序の "パーツ"を持っていることを知っているならば、この解決策は有効です。私たちの特定のケースでは、テキストの構造がランダムに変わる可能性があります(順序、「パーツ」の数、複製されるパーツなど)。これのより良い例が質問の最後に追加されました。 –
私はそれを解決するために解決策を提示しました。 –