10

次の例では、フィールド内のマップ オブジェクトのネストされたレコードを含む寄木細工のファイルを読み込んでいmetaます。sparklyrこれらをうまく処理しているようです。ただしtidyr::unnest、SQL (または HQL - 当然のことながら - のようなものLATERAL VIEW explode()) には変換されないため、使用できません。他の方法でデータのネストを解除する方法はありますか?

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 文字列 (Hive がそのようなデータを返す方法) の代わりに要素がまだ含まれています。tidyrこれにより、収集されたデータでさえ機能しない状況が作成されます。

私が行方不明になっていることsparklyrで、よりうまく仕事をする方法はありますか? tidyrそうでない場合、これは将来のsparklyr開発で計画されていますか?

4

4 に答える 4

1

これは、Hive に依存しない別のオプションです (少なくとも直接的にLATERAL VIEW explode()は、Hive のものです)。

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 ステートメントのサポートが必要になります。おそらく、tidyr::unnest構文のようなものがうまくいくでしょう:

tf %>%
  sdf_mutate(a=ft_explode(meta)) %>%
  unnest(a)
于 2016-10-27T21:10:15.397 に答える
0

explode()a で直接使用してmutate()、sparklyr で配列を展開することもできます。

df %>%
  mutate(my_values = explode(my_array))

注: これには sparklyr.nested は必要ありません

于 2018-10-10T07:48:53.083 に答える