some codes

extern crate arrow;
extern crate tokio;

use std::convert::TryFrom;
use std::sync::Arc;
// use arrow::array::{Float64Array, Int64Array, Date32Array, Date64Array, Time64MicrosecondArray, Float32Builder, Float16Array};
use arrow::ipc::TimeUnit;
use datafusion::arrow::array::{Int32Array, 
    BooleanArray,
    BooleanBuilder,
    ArrayRef,
    ArrayData
};
use datafusion::arrow::datatypes::{
    DataType, 
    Field, 
    Schema};
use datafusion::arrow::record_batch::RecordBatch;
use datafusion::datasource::MemTable;
use datafusion::error::Result;
use datafusion::from_slice::FromSlice;
use datafusion::prelude::*;

use datafusion::arrow::{array::{
    Int8Array, StringArray,
    PrimitiveBuilder, StringBuilder, StringDictionaryBuilder,Float32Builder,
    Float64Builder,
    Int64Builder,
    Date32Builder,
    Date64Builder,
    StructArray,
    Array
    // ArrayData
  },
  datatypes::Int8Type,
};


#[tokio::main]
async fn main(){
    // 字符串
    let mut sbuilder = StringBuilder::new(100);
    sbuilder.append_value("a").unwrap();
    sbuilder.append_null().unwrap();
    sbuilder.append_value("许多编程语言里,我们都非常乐于去研究在这个语言中所使用的异步网络编程的框架,比如说Python的 Gevent、asyncio,Nginx 和 OpenResty,Go 等,今年年初我开始接触 Rust,并被其无 GC、内存安全、极小的运行时等特性所吸引,经过一段时间的学习,开始寻找构建实际项目的解决方案,很快 mio、tokio 等框架进入了我的视野,于是开始从更加底层的 mio 出发实验。
    https://github.com/Hevienz/mio_test/blob/master/src/main.rs
    可以看到 mio 是一个非常底层的异步编程的框架,这意味着如果我们要在实际的项目开发中使用它时,就不得不从 event loop 开始编写我们的软件,这并不是我们所期望的,于是我们需要一个更高层次抽象的框架,这便是本文要为大家讲述的 tokio。
    tokio
    tokio 是 Rust 中的异步编程框架,它将复杂的异步编程抽象为 Futures、Tasks 和 Executor,并提供了 Timers 等基础设施,下文中我们将一一展开。
    运行时模型
    tokio 是一个基于轮训的模型。比如我们要在 tokio 上调度我们的 task,我们需要为其实现 Future trait。比如下面的例子中,我们想要得到一个 widget,但它有可能还没有准备好,这时候我们调用 poll 的结果就是 Ok(Async::NotReady),Executor 会负责重复的调用 poll,直到 widget 准备好,返回Ok(Async::Ready(()))。
    pub struct MyTask;").unwrap();
    sbuilder.append_value("add").unwrap();
    sbuilder.append_value("aaaaaa").unwrap();
    let astr = sbuilder.finish();

    // i32
    let mut builder = Int32Array::builder(5);
    builder.append_value(5).unwrap();
    builder.append_null().unwrap();
    builder.append_slice(&[1,2,3]).unwrap();
    let ai32 = builder.finish();

    // bool
     let mut c = BooleanBuilder::new(5);
     c.append_value(true).unwrap();
     c.append_value(true).unwrap();
     c.append_null().unwrap();
     c.append_value(false).unwrap();
     c.append_value(true).unwrap();
     let abool = c.finish();

    // f64
    // let mut f64a = Float64Array::builder(5);
    let mut f64a = Float64Builder::new(5);
    f64a.append_value(5.9).unwrap();
    f64a.append_value(5.1).unwrap();
    f64a.append_null().unwrap();
    f64a.append_value(5.2).unwrap();
    f64a.append_value(5.6).unwrap();
    let af64 = f64a.finish();

    // i64
    let mut i64a = Int64Builder::new(5);
    i64a.append_value(4).unwrap();
    i64a.append_value(4).unwrap();
    i64a.append_null().unwrap();
    i64a.append_value(4).unwrap();
    i64a.append_value(4).unwrap();
    let ai64 = i64a.finish();

    // date32
    let mut d32a = Date32Builder::new(5);
    d32a.append_value(45001).unwrap();
    d32a.append_value(45001).unwrap();
    d32a.append_null().unwrap();
    d32a.append_value(45001).unwrap();
    d32a.append_value(45001).unwrap();
    let ad32 = d32a.finish();

    // date64
    let mut d64a = Date64Builder::new(5);
    d64a.append_value(46502).unwrap();
    d64a.append_value(46502).unwrap();
    d64a.append_null().unwrap();
    d64a.append_value(46502).unwrap();
    d64a.append_value(46502).unwrap();
    let ad64 = d64a.finish();
    
    let mut f32l = Float32Builder::new(100);
    f32l.append_value(1.1).unwrap();
    f32l.append_null();
    f32l.append_value(1.2).unwrap();
    f32l.append_value(1.3).unwrap();
    f32l.append_value(1.4).unwrap();
    let af32 = f32l.finish();

    // Utf8
    // Int32
    // Boolean
    // Float64
    // Int64
    // Date32
    // Date64
    // Float32

    let schema = Arc::new(Schema::new(vec![
        Field::new("astr", DataType::Utf8, false),
        Field::new("ai32", DataType::Int32, false),
        Field::new("abool", DataType::Boolean, false),
        Field::new("af64", DataType::Float64, false),
        Field::new("ai64", DataType::Int64, false),
        Field::new("ad32", DataType::Date32, false),
        Field::new("ad64", DataType::Date64, false),
        Field::new("af32", DataType::Float32, false),
    ]));
    let batch = RecordBatch::try_new(
        schema.clone(),
        vec![
            Arc::new(astr),
            Arc::new(ai32),
            Arc::new(abool),
            Arc::new(af64),
            Arc::new(ai64),
            Arc::new(ad32),
            Arc::new(ad64),
            Arc::new(af32),
        ],
    ).unwrap();

    for each in batch.columns(){
        println!("{:?}", each.data_type());
    }

    // let xx = batch.column(0);
    // let yy = xx.clone().;
    // let zz = yy.as_any();
    // let zzz:Option<&String> = zz.downcast_ref();
    // // let zz = yy.offset();
    // // let zzz = zz.0;
    // println!("{:?}",zzz);

    // for each in batch.columns().into_iter(){
    //     println!("{:?}", each);
    //     println!("---------------------");
    // }
        
    // println!("====================");
    // let ctx = SessionContext::new();
    // let provider = MemTable::try_new(schema, vec![vec![batch]]).unwrap();
    // ctx.register_table("t", Arc::new(provider)).unwrap();

    // let df:Arc<DataFrame> = ctx.table("t").unwrap();
    // df.show().await().unwrap();
    // ====================================================================================================================


    // let struct_array = StructArray::from(vec![
    //     (
    //         Field::new("b", DataType::Boolean, false),
    //         Arc::new(BooleanArray::from(vec![false, false, true, true]))
    //             as Arc<dyn Array>,
    //     ),
    //     (
    //         Field::new("c", DataType::Int32, false),
    //         Arc::new(Int32Array::from(vec![42, 28, 19, 31])),
    //     ),
    // ]);
    // let aaa = struct_array.column_by_name("c").unwrap();
    // // let l = &aaa.len();
    // // let ll = l.clone();
    // // let ccc = aaa.slice(1, 1);
    // println!("{:?}", aaa.data().);
    // // for i in 0..ll{
    // //     println!("{:?}", aaa.slice(i, 1));
    // // }



    // ==================================================================================================================
    // let mut sbuilder = StringBuilder::new(100);
    // sbuilder.append_value("a").unwrap();
    // sbuilder.append_null().unwrap();
    // sbuilder.append_value("hello").unwrap();
    // sbuilder.append_value("add").unwrap();
    // sbuilder.append_value("aaaaaa").unwrap();
    // let a = sbuilder.finish();

    // let mut sd = Float32Builder::new(5);
    // sd.append_value(DataType::Decimal(4, 2));


    // let schema = Arc::new(Schema::new(vec![
    //     Field::new("a", DataType::Utf8, false),
    // ]));
    // let batch = RecordBatch::try_new(
    //     schema.clone(),
    //     vec![
    //         Arc::new(a),
    //     ],
    // ).unwrap();
    // let c = batch.column(0);
    // let d = c.data_type();
    // println!("{:?}", d);

    // let e = c.as_any().downcast_ref::<StringArray>();
    // let f: &StringArray = e.unwrap();
    // println!("{:?}", f);
    // let xxxx = f.value(0);
    // print!("{:?}", xxxx); 
    // match d{
    //     DataType::Utf8 => print!("utf8"),
    //     _ => print!("unknow"),
    // }
}

  

posted @ 2022-09-15 20:27  CrossPython  阅读(21)  评论(0)    收藏  举报