GitHub user ifsheldon closed a discussion: How can I construct a table with a 
field that is List of String?

Hi, I am new to Datafusion, and I want to use it as an in-memory DB. I have 
read the doc and it seems I can construct a table in which a field, say 
`properties` can be an array/list of strings.


I try to modify this example 
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/dataframe_in_memory.rs
 but I don't know how to insert the data of a list of lists of strings into the 
table.

I cannot find something useful in the documentation. Can anyone help? Or, if 
you have pointers to related info, that would be great!

Here is my code.

```rust
#[cfg(test)]
mod test {
    use std::sync::Arc;

    use datafusion::arrow::array::{Int32Array, ListArray, StringArray};
    use datafusion::arrow::datatypes::{DataType, Field, Schema, Utf8Type};
    use datafusion::arrow::record_batch::RecordBatch;
    use datafusion::error::Result;
    use datafusion::prelude::*;

    #[tokio::test]
    async fn test_datafustion() -> Result<()> {
        // define a schema.
        let schema = Arc::new(Schema::new(vec![
            Field::new("id", DataType::Utf8, false),
            Field::new_list("properties", Arc::new(Field::new("property", 
DataType::Utf8, false)), true),
        ]));
        // define data. Error Here
        let batch = RecordBatch::try_new(
            schema,
            vec![
                Arc::new(StringArray::from(vec!["a", "b", "c", "d"])),
                // according to the code sample in the doc of 
ListArray::from_iter_primitive, seems type mismatched
                Arc::new(ListArray::from_iter_primitive(vec![
                    Some(vec![Some("a"), Some("a")]),
                    Some(vec![Some("b"), Some("b")]),
                    Some(vec![Some("c"), Some("c")]),
                    Some(vec![Some("d"), Some("d")]),
                ])),
            ],
        )?;
        let ctx = SessionContext::new();
        ctx.register_batch("t", batch)?;
        let df = ctx.table("t").await?;
        // find a row in which properties contains "b"
        let filter = array_has(col("properties"), lit("b"));
        let df = df.select_columns(&["id", "properties"])?.filter(filter)?;
        df.show().await?;

        Ok(())
    }
}
```

GitHub link: https://github.com/apache/datafusion/discussions/12933

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to