2016-09-01 21 views
8

次の例では、metaフィールドにマップオブジェクトのネストされたレコードを含む寄木張りファイルをロードしました。 sparklyrはこれらを扱う素晴らしい仕事をしているようです。しかしtidyr::unnestはSQL(またはHQL - わかりやすく - LATERAL VIEW explode()のように)に翻訳されず、したがって使用できません。他の方法でデータを無効にする方法はありますか?sparklyrでネストされたデータを処理する方法はありますか?

tfl <- head(tf) 
tfl 
Source: query [?? x 10] 
Database: spark connection master=yarn-client app=sparklyr local=FALSE 

          trkKey    meta  sources startTime 
          <chr>   <list>  <list> <list> 
1 3juPe-k0yiMcANNMa_YiAJfJyU7WCQ3Q <S3: spark_jobj> <list [24]> <dbl [1]> 
2 3juPe-k0yiAJX3ocJj1fVqru-e0syjvQ <S3: spark_jobj> <list [1]> <dbl [1]> 
3 3juPe-k0yisY7UY_ufUPUo5mE1xGfmNw <S3: spark_jobj> <list [7]> <dbl [1]> 
4 3juPe-k0yikXT5FhqNj87IwBw1Oy-6cw <S3: spark_jobj> <list [24]> <dbl [1]> 
5 3juPe-k0yi4MMU63FEWYTNKxvDpYwsRw <S3: spark_jobj> <list [7]> <dbl [1]> 
6 3juPe-k0yiFBz2uPbOQqKibCFwn7Fmlw <S3: spark_jobj> <list [19]> <dbl [1]> 
# ... with 6 more variables: endTime <list>, durationInMinutes <dbl>, 
# numPoints <int>, maxSpeed <dbl>, maxAltitude <dbl>, primaryKey <chr> 

データを収集する際にも問題があります。例えば、

上記で
tfl <- head(tf) %>% collect() 
tfl 
# A tibble: 6 × 10 
          trkKey    meta  sources startTime 
          <chr>   <list>  <list> <list> 
1 3juPe-k0yiMcANNMa_YiAJfJyU7WCQ3Q <S3: spark_jobj> <list [24]> <dbl [1]> 
2 3juPe-k0yiAJX3ocJj1fVqru-e0syjvQ <S3: spark_jobj> <list [1]> <dbl [1]> 
3 3juPe-k0yisY7UY_ufUPUo5mE1xGfmNw <S3: spark_jobj> <list [7]> <dbl [1]> 
4 3juPe-k0yikXT5FhqNj87IwBw1Oy-6cw <S3: spark_jobj> <list [24]> <dbl [1]> 
5 3juPe-k0yi4MMU63FEWYTNKxvDpYwsRw <S3: spark_jobj> <list [7]> <dbl [1]> 
6 3juPe-k0yiFBz2uPbOQqKibCFwn7Fmlw <S3: spark_jobj> <list [19]> <dbl [1]> 
# ... with 6 more variables: endTime <list>, durationInMinutes <dbl>, 
# numPoints <int>, maxSpeed <dbl>, maxAltitude <dbl>, primaryKey <chr> 

tfl %>% unnest(meta) 
Error: Each column must either be a list of vectors or a list of data frames [meta] 

は、metaファイルがまだspark_jobj要素の代わりに、リスト、data.frames、または(ハイブは、このようなデータを返す方法です)でも、JSON文字列が含まれています。これは、tidyrが収集されたデータでさえも機能しない状況を作り出します。

私が紛失しているtidyrsparklyrをよりうまく機能させる方法はありますか?そうでない場合、これは将来のために計画されていますsparklyr

答えて

1

私はようやくこれに対する私の答えを持っている:おそらくtidyr::unnest構文のようなものは、トリックを行うだろう。同様に、ローカル・データ・フレームのための方法をtidyr::unnest振る舞いに

tf %>% 
    sdf_unnest(meta) 

これはスパークデータフレームのために動作します:https://mitre.github.io/sparklyr.nested/https://github.com/mitre/sparklyr.nestedソース)を参照してください。ネストされたselect操作とexplode操作も実装されています。

1

これはまさに適切な解決策ではありませんが、Hiveを使用して表やビューを生成することをお勧めします(例:create view db_name.table_name as select ...)。分解操作を処理する。これにより、sparklyrのフラットデータが処理されます。 scは、sparklyr経由のスパーク接続の場合、DBI::dbGetQuery(sc, "USE db_name")を使用することができ、Hiveが設定されていると仮定すると、src_tbls(sc)という表を表示すると表示されます。 dat <- tbl(sc, "table_name")を実行すると、そこから円滑に航行するはずです。

これはsparklyrソリューションではありません(これ以上のHiveソリューション)。私はこの回答を受け入れません。

1

Hiveに依存しない別のオプションがあります(少なくとも直接的には、LATERAL VIEW explode()はハイブのものです)。

tf %>% 
    sdf_mutate(ft_sql_transformer(
    b, paste0("SELECT trkKey, a.fld1 as fld1, a.fld2 as fld2", 
       "FROM __THIS__ LATERAL VIEW explode(__THIS__.meta) x AS a"))) 

私はまだのようなものを参照したいと思いますので、どちらか、この答えを受け入れるつもりはない:

tf %>% 
    sdf_mutate(a=ft_explode(meta)) 

をそれがネストされたSELECT文のためのサポートを必要とします。

tf %>% 
    sdf_mutate(a=ft_explode(meta)) %>% 
    unnest(a) 
関連する問題