2016-09-01 10 views
8

निम्नलिखित उदाहरण में मैंने एक पैराक्वेट फ़ाइल लोड की है जिसमें 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 फ़ाइल अभी भी सूची, data.frames, या यहाँ तक JSON तार के बजाय spark_jobj तत्व शामिल हैं (जो कैसे हाइव इस तरह के डेटा वापसी होगी)। यह ऐसी स्थिति बनाता है जहां tidyr एकत्रित डेटा पर भी काम नहीं करता है।

sparklyr पाने के लिए tidyr के साथ और अधिक अच्छी तरह से काम करने के लिए कोई तरीका है कि मुझे याद आ रही है? यदि नहीं, तो क्या यह भविष्य के लिए sparklyr विकास के लिए योजनाबद्ध है?

उत्तर

1

मैं अंत में यह करने के लिए मेरा उत्तर है। इसी तरह स्थानीय डेटा फ्रेम के लिए कैसे tidyr::unnest बर्ताव करने के लिए

tf %>% 
    sdf_unnest(meta) 

यह स्पार्क डेटा फ्रेम के लिए व्यवहार करेंगे: https://mitre.github.io/sparklyr.nested/ (https://github.com/mitre/sparklyr.nested स्रोत) देखें। नेस्टेड चयन और विस्फोट संचालन भी लागू किए जाते हैं।

1

यह बिल्कुल उचित समाधान नहीं है, हालांकि एक काम चारों ओर एक टेबल या दृश्य उत्पन्न करने के लिए हैव का उपयोग करना है (उदाहरण के लिए, create view db_name.table_name as select ...)। जो विस्फोट ऑपरेशन को संभालता है। यह काम करने के लिए sparklyr के लिए फ्लैट डेटा प्रदान करता है। scsparklyr के माध्यम से एक स्पार्क कनेक्शन हैका उपयोग कर DBI::dbGetQuery(sc, "USE db_name") का उपयोग कर सकते हैं मानते हैं कि हाइव कॉन्फ़िगर किया गया है और दृश्य src_tbls(sc) के साथ तालिका सूचीबद्ध करते समय दिखाई देगा। एक बार जब आप dat <- tbl(sc, "table_name") निष्पादित कर लेंगे तो यह वहां से आसान नौकायन होना चाहिए।

चूंकि यह sparklyr समाधान नहीं है (लेकिन एक हाइव समाधान का अधिक) मैं इस उत्तर को स्वीकार नहीं करूंगा।

1

यहां एक और विकल्प है जो हाइव पर निर्भर नहीं है (कम से कम सीधे, 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)) 

लेकिन वह नेस्ट का चयन करें बयान के लिए समर्थन की आवश्यकता होगी। शायद tidyr::unnest वाक्य रचना की तरह कुछ चाल करना होगा:

tf %>% 
    sdf_mutate(a=ft_explode(meta)) %>% 
    unnest(a) 
संबंधित मुद्दे

 संबंधित मुद्दे