DataFrame и DataSet - преобразование значений в < k, v > пара

Ваш цикл копирования не пытается обнаружить EOF. Он должен читать:

int ch;
while ((ch = fgetc(fp)) != EOF)
    fputc(ch, fp);

Обратите внимание, что значение считывается в int, а не в char. Функции getchar(), getc() и fgetc() возвращают int, который либо содержит положительное число, представляющее символ (байт), обработанный как unsigned char, либо возвращает отрицательное значение EOF (которое обычно, но не обязательно, -1). Вы не можете сохранить все эти значения в char; вы должны использовать int.

Также немного странно просить вашего пользователя ввести имя файла, а затем игнорировать то, что они вводят. В большинстве случаев это так же хорошо, как и вы; вам нужно больше одного char filename1 или char filename2 для хранения имени файла, и вам нужно использовать %s, а не %c, чтобы прочитать имена. К счастью, вы используете фиксированные строковые литералы для имен файлов в вызовах fopen().

Причина, по которой второй вход, похоже, не дождался, заключается в том, что ваш первый вызов scanf() читает один символ , поэтому даже если вы введете a в качестве имени файла, во входной строке также будет указана новая строка. Второй scanf() читает новую строку. Есть только 3 формата, которые не пропускают ведущее белое пространство (например, новые строки). Это %c, %[…] (наборы сканирования) и %n.

-1
задан Sarfaraz Hussain 20 January 2019 в 05:42
поделиться

1 ответ

Я верю, что вам нужна структура, когда вы говорите «пара». проверьте, дает ли приведенный ниже код ожидаемый результат.

С DataFrame:

import spark.sqlContext.implicits._
import org.apache.spark.sql.functions._
val data = Seq(("111",5,50000),("222",6,60000),("333",7,60000))
val df = data.toDF("EmpId","Experience","Salary")

val newdf = df.withColumn("EmpId", struct(lit("1").as("key"),col("EmpId").as("value")))
  .withColumn("Experience", struct(lit("2").as("key"),col("Experience").as("value")))
  .withColumn("Salary", struct(lit("3").as("key"),col("Salary").as("value")))
  .show(false)

вывод:

+--------+----------+----------+
|EmpId   |Experience|Salary    |
+--------+----------+----------+
|[1, 111]|[2, 5]    |[3, 50000]|
|[1, 222]|[2, 6]    |[3, 60000]|
|[1, 333]|[2, 7]    |[3, 60000]|
+--------+----------+----------+

С набором данных:

Сначала вам нужно определить класс дела для новой структуры, иначе вы не сможете создать набор данных

case class Employee2(EmpId: EmpData, Experience: EmpData, Salary: EmpData)
case class EmpData(key: String,value:String)

val ds = df.as[Employee]
val newDS = ds.map(rec=>{
  (EmpData("1",rec.EmpId), EmpData("2",rec.Experience.toString),EmpData("3",rec.Salary.toString))
})
val finalDS = newDS.toDF("EmpId","Experience","Salary").as[Employee2]
finalDS.show(false)

Вывод:

+--------+--------+------------+
|EmpId   |Experience|Salary    |
+--------+--------+------------+
|[1, 111]|[2, 5]  |[3, 50000]  |
|[1, 222]|[2, 6]  |[3, 60000]  |
|[1, 333]|[2, 7]  |[3, 60000]  |
+--------+--------+------------+

Спасибо

0
ответ дан Naveen Nelamali 20 January 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: